0

这是我正在测试线路的示例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()是否发生?

我认为起订量是解决方案,但从评论看来不是,所以我做了另一个例子,没有任何起订量:

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")); 
}

是否有可能做到这一点?值得吗?

4

1 回答 1

0

关于第一段代码:

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

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

但我建议不要这样做,我什至建议不要尝试只测试这个类。您将测试代码与实现代码耦合得太紧。考虑做 TDD:问问自己如果没有测试,应用程序的哪些功能会中断。针对该功能编写测试,该功能应该会失败。然后编写 if 测试来修复测试。

于 2013-08-25T20:43:24.473 回答