27
34
gsm = getGlobalSiteManager()
28
35
provideHandler(self._handler)
29
36
self.addCleanup(gsm.unregisterHandler, self._handler)
39
class ZopeViewReplacementFixture(Fixture):
40
"""A fixture that allows you to temporarily replace one view with another.
42
This will not work with the AppServerLayer.
45
def __init__(self, name, context_interface,
46
request_interface=IDefaultBrowserLayer,
48
super(ZopeViewReplacementFixture, self).__init__()
50
self.context_interface = context_interface
51
self.request_interface = request_interface
52
self.gsm = getGlobalSiteManager()
53
# It can be convenient--bordering on necessary--to use this original
54
# class as a base for the replacement.
55
self.original = self.gsm.adapters.registered(
56
(context_interface, request_interface), Interface, name)
57
self.checker = getCheckerForInstancesOf(self.original)
58
if self.original is None:
59
# The adapter registry does not provide good methods to introspect
60
# it. If it did, we might try harder here.
62
'No existing view to replace. Wrong request interface? '
64
self.replacement = replacement
67
super(ZopeViewReplacementFixture, self).setUp()
68
if self.replacement is None:
69
raise ValueError('replacement is not set')
70
self.gsm.adapters.register(
71
(self.context_interface, self.request_interface), Interface,
72
self.name, self.replacement)
73
# The same checker should be sufficient. If it ever isn't, we
74
# can add more flexibility then.
75
defineChecker(self.replacement, self.checker)
78
super(ZopeViewReplacementFixture, self).tearDown()
79
undefineChecker(self.replacement)
80
self.gsm.adapters.register(
81
(self.context_interface, self.request_interface), Interface,
82
self.name, self.original)