断言调用方法以使if条件受到测试

时间:2013-08-25 02:45:39

标签: c# unit-testing moq

以下是我测试行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")); 
}

有可能这样做吗?值得吗?

1 个答案:

答案 0 :(得分:0)

关于第一段代码:

mock是一个模拟对象。这意味着所有方法都被覆盖并且什么都不做。因此,调用mock.start()不执行任何操作并且永远不会调用called()是完全正常的。

如果您只想模拟called()并使用start()的实际实现,则需要进行部分模拟。

但是我会建议反对,我甚至建议不要试图测试这个课程。您将测试代码与实现代码紧密耦合。考虑做TDD:如果测试不存在,请问自己应用程序的哪些功能会中断。针对该功能编写测试,该测试应该失败。然后编写if测试来修复测试。