以下是我测试行if (true)
的示例。但是,尽管条件显然是正确的,但Moq告诉我这种方法从未被调用过。
public class test
{
public virtual void start()
{
if (true)
called();
}
public virtual void called()
{
}
}
[Test]
public void QuickTest()
{
var mock = new Mock<test>();
mock.Object.start();
mock.Verify(t => t.start(), "this works");
mock.Verify(t => t.called(), "crash here: why not called?");
}
如何测试对called()
的方法调用是否已经发生?
我认为Moq是解决方案,但是从评论来看,它看起来并非如此,我在没有任何Moq参考的情况下做了另一个例子:
public class test
{
public bool condition = true;
public test(bool cond)
{
condition = cond;
}
public virtual string start()
{
var str = "somestuff";
if (condition)
str += called();
str += "something more";
return str;
}
public virtual string called()
{
return "something more";
}
}
[Test]
public void ConditionTrue_CallsCalled()
{
var t = new test(true);
t.start();
//syntax? t.HasCalled("called");
Assert.IsTrue(result.Contains("something more"));
}
[Test]
public void ConditionFalse_NoCall()
{
var t = new test(false);
t.start();
//syntax? t.HasNotCalled("called");
// Can't check this way because something more is already being added
Assert.IsFalse(result.Contains("something more"));
}
有可能这样做吗?值得吗?
答案 0 :(得分:0)
关于第一段代码:
mock
是一个模拟对象。这意味着所有方法都被覆盖并且什么都不做。因此,调用mock.start()
不执行任何操作并且永远不会调用called()
是完全正常的。
如果您只想模拟called()
并使用start()
的实际实现,则需要进行部分模拟。
但是我会建议反对,我甚至建议不要试图测试这个课程。您将测试代码与实现代码紧密耦合。考虑做TDD:如果测试不存在,请问自己应用程序的哪些功能会中断。针对该功能编写测试,该测试应该失败。然后编写if测试来修复测试。