def test_attribute_requested_returns_true_if_tracking_and_requested(self): stub = EmptyFake() stub.thing = None spy = MasterSpy(stub, affect_only_functions=False) spy.thing assert spy.attribute_was_requested( "thing"), "Spy did not report that attribute was requested"
class TestMemoryLeakProtection(TestCase): def setUp(self): self.context = open_dependency_context() Evidence.subscriber_ran = False self.fake_log = MasterSpy(EmptyFake()) self.context.inject(logging, self.fake_log) def tearDown(self): self.context.close() def test_bound_subscriber_gets_garbage_collected(self): # When the subscriber instantiates, it subscribes to an event # This causes the event broker to store a reference to the subscriber. # The test does not create a reference to the subscriber, so the broker # has the only reference. Subscriber() # Because the broker has the only reference, the subscriber should # be eligible for garbage collection. gc.collect() EventBroker.publish(event=EVENT) assert not Evidence.subscriber_ran, "Subscriber ran after it should have been garbage collected" def test_unbound_subscriber_gets_garbage_collected(self): def subscriber(): Evidence.subscriber_ran = True EventBroker.subscribe(event=EVENT, func=subscriber) subscriber = None gc.collect() EventBroker.publish(event=EVENT) assert not Evidence.subscriber_ran, "Subscriber ran after it should have been garbage collected" def errors_logged(self): if self.fake_log.attribute_was_requested("error"): spy = self.fake_log.attribute_spies["error"] return [args[0] for args, kwargs in spy.call_history] def test_does_not_attempt_to_run_garbage_collected_subscriber(self): def subscriber(): pass EventBroker.subscribe(event=EVENT, func=subscriber) subscriber = None gc.collect() EventBroker.publish(event=EVENT) assert not self.errors_logged( ), 'Unexpected errors in the log: "%s"' % (self.errors_logged())
def test_attribute_requested_returns_false_if_tracking_and_not_req(self): stub = EmptyFake() stub.thing = None spy = MasterSpy(stub, affect_only_functions=False) assert not spy.attribute_was_requested('thing'), \ 'Spy reported that attribute was requested'
class TestQuitOnSuiteEnd(TestCase): def setUp(self): EventBroker.reset() self.context = open_dependency_context(supply_env=True) self.webdriver_spy = MasterSpy(EndlessFake()) self.context.inject(webdriver, self.webdriver_spy) def tearDown(self): self.context.close() def quit_was_called(self): assert self.webdriver_spy.attribute_was_requested( USE_BROWSER), "%s was not invoked" % USE_BROWSER launcher_spy = self.webdriver_spy.attribute_spies[USE_BROWSER] expect(launcher_spy.return_value_spies).to(have_length(1)) driver_spy = launcher_spy.return_value_spies[0] if "quit" in driver_spy.attribute_spies.keys(): quit_spy = driver_spy.attribute_spies["quit"] return bool(quit_spy.return_value_spies) return False def test_quits_browser_on_suite_end(self): sut = Browser() sut # silence a warning about an unused variable assert not self.quit_was_called(), "quit() was called prematurely" EventBroker.publish(event=TestEvent.suite_ended) assert self.quit_was_called(), "quit() was not called" def set_debug_flag(self): self.context.set_env(SUPPRESS_BROWSER_EXIT_ON_FAILURE="tRuE") def test_does_not_quit_when_debugging_and_suite_erred(self): self.set_debug_flag() sut = Browser() sut EventBroker.publish(event=TestEvent.suite_erred) EventBroker.publish(event=TestEvent.suite_ended) assert not self.quit_was_called(), "quit() was called" def test_does_not_quit_when_debugging_and_test_erred(self): self.set_debug_flag() sut = Browser() sut EventBroker.publish(event=TestEvent.test_erred) EventBroker.publish(event=TestEvent.suite_ended) assert not self.quit_was_called(), "quit() was called" def test_does_not_quit_when_debugging_and_test_failed(self): self.set_debug_flag() sut = Browser() sut EventBroker.publish(event=TestEvent.test_failed) EventBroker.publish(event=TestEvent.suite_ended) assert not self.quit_was_called(), "quit() was called" def test_quits_when_debugging_and_nothing_failed(self): self.set_debug_flag() sut = Browser() sut EventBroker.publish(event=TestEvent.suite_ended) assert self.quit_was_called(), "quit() was not called"