首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleTest模拟对象:清除期望

SimpleTest模拟对象:清除期望
EN

Stack Overflow用户
提问于 2009-10-26 02:15:11
回答 1查看 1.2K关注 0票数 1

简短的问题:是否有一种方法可以在SimpleTest中重置一个模拟对象,消除所有期望?

更详细的解释是:

我有一个使用SimpleTest测试的类,它使用的模拟对象有一些问题。

这个类是一个Logger,在记录器中有许多Writer对象(FileWriterEmailWriter等)。调用Logger::log()方法在幕后执行一些逻辑,并将消息路由到正确的编写器。编写器被缓存在Logger类中,以保存每次重新实例化每个写入器。

在我的单元测试中,我设置了一个Logger,创建并向它添加了一些Mock Writer对象,然后使用MockDBWriter->expectOnce()之类的方法来测试Logger是否正常工作。

现在的问题是,我想测试Logger的另一个函数,但是expectOnce期望仍然有效,导致我随后的测试失败。

代码语言:javascript
复制
function testWritesMessageOK() {
    $log = Logger::getInstance();
    $mock = new MockFileWriter($this);

    $log->addWriter($mock);

    $mock->expectOnce("write", "Message");

    $log->write("Message");    // OK
}

// this is just an example - the actual test is much less inane
function testNumberOfWrites() {
    $log = Logger::getInstance();
    $mock = $log->getWriter();

    $mock->expectCallCount('write', 2);

    $log->write("One");    // fail - it doesn't match "Message"
    $log->write("Two");
}

是否有办法重置模拟对象,消除所有期望?

EN

回答 1

Stack Overflow用户

发布于 2009-10-26 10:31:11

使用单独的模拟实例.

以下任一项:

代码语言:javascript
复制
$mock = $log->getWriter();
$mock = new $mock;

或者:

代码语言:javascript
复制
$mock = new MockFileWriter($this);
// And then:
$mock = new MockDBWriter($this);
// And then:
$mock = new MockEmailWriter($this);
// etc.

我会质疑缓存作者以保存重新实例化的智慧。如果您将实例化作为一个廉价操作(即,不要创建DB连接或其他任何操作),并将这类事情推迟到实际需要连接(例如第一个查询)时,那么您将不需要缓存,整个问题可能就会消失。

您可以做的另一件事是调用SimpleMock构造函数。

代码语言:javascript
复制
$mock = $log->getWriter();
$mock->SimpleMock();

它将完成所有这一切:

代码语言:javascript
复制
/**
 *    Creates an empty action list and expectation list.
 *    All call counts are set to zero.
 *    @access public
 */
function SimpleMock() {
    $this->_actions = &new SimpleCallSchedule();
    $this->_expectations = &new SimpleCallSchedule();
    $this->_call_counts = array();
    $this->_expected_counts = array();
    $this->_max_counts = array();
    $this->_expected_args = array();
    $this->_expected_args_at = array();
    $test = &$this->_getCurrentTestCase();
    $test->tell($this);
}

唯一的问题是,tell()在结束时调用,这将导致SimpleMock::atTestEnd()在总结期望时被调用两次。但是,你可以用这个解决这个问题:

代码语言:javascript
复制
// $this should == the test case in question
array_pop($this->_observers);

这个答案基于SimpleTest的1.0.1版本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1622810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档