【发布时间】:2013-08-25 02:45:39
【问题描述】:
这是我正在测试行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 是解决方案,但从 cmets 看来并非如此,所以我做了另一个示例,没有提及 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"));
}
可以这样做吗?值得吗?
【问题讨论】:
-
.... 你真的模拟了你想测试的对象吗?我的意思是,考虑一下。
-
我正在运行这个确切的代码,
Verify(t => t.start()可以工作,但Verify(t => t.called()不能。我一定是错过了什么...... -
你知道什么是 Mock 吗?
-
您可以使用
new Mock<test>() { CallBase = true }来调用基本实现,如果您希望它这样做,但我同意您通常不会模拟被测类。 -
Mocks 用于模拟其他对象,因此您可以在不受其他类干扰的情况下测试您的类。基本上,它从一个接口创建一个空壳,没有任何逻辑。因此,嘲笑你的班级,即清除其中的所有逻辑,绝对没有任何意义。 Read more about mocks
标签: c# unit-testing moq