断言调用一个方法来测试if条件
本文关键字:方法 测试 if 条件 一个 调用 断言 | 更新日期: 2023-09-27 18:28:59
下面是一个我正在测试线路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"));
}
有可能做到这一点吗?这值得吗?
关于第一段代码:
mock
是一个mock对象。这意味着所有的方法都被重写,什么也不做。因此,调用mock.start()
不起任何作用,并且从未调用called()
,这是完全正常的。
如果只想模拟called()
并使用start()
的实际实现,则需要进行部分模拟。
但我建议不要这样,我甚至建议不要只测试这门课。您将把测试代码与实现代码结合得过于紧密。考虑一下TDD:问问自己,若并没有测试,那个么应用程序的什么功能会被破坏。针对该功能编写一个测试,该测试应该会失败。然后编写if测试来修复测试。