【问题标题】:Assert that a method is called to bring an if condition under test断言调用了一个方法来测试一个 if 条件
【发布时间】: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 =&gt; t.start() 可以工作,但Verify(t =&gt; t.called() 不能。我一定是错过了什么......
  • 你知道什么是 Mock 吗?
  • 您可以使用new Mock&lt;test&gt;() { CallBase = true } 来调用基本实现,如果您希望它这样做,但我同意您通常不会模拟被测类。
  • Mocks 用于模拟其他对象,因此您可以在不受其他类干扰的情况下测试您的类。基本上,它从一个接口创建一个空壳,没有任何逻辑。因此,嘲笑你的班级,即清除其中的所有逻辑,绝对没有任何意义。 Read more about mocks

标签: c# unit-testing moq


【解决方案1】:

关于第一段代码:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多