断言调用一个方法来测试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")); 
}

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

断言调用一个方法来测试if条件

关于第一段代码:

mock是一个mock对象。这意味着所有的方法都被重写,什么也不做。因此,调用mock.start()不起任何作用,并且从未调用called(),这是完全正常的。

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

但我建议不要这样,我甚至建议不要只测试这门课。您将把测试代码与实现代码结合得过于紧密。考虑一下TDD:问问自己,若并没有测试,那个么应用程序的什么功能会被破坏。针对该功能编写一个测试,该测试应该会失败。然后编写if测试来修复测试。