【问题标题】:Is there any better way of writing this test with Moq?有没有更好的方法来用 Moq 编写这个测试?
【发布时间】:2012-04-28 20:52:42
【问题描述】:

我有一个私有方法,它在我正在测试的方法中被调用。我想验证是否将正确的参数传递给这个私有方法。我在 Moq 中编写了以下设置,它将测试我想要的内容,但它并不能真正让我遵循 Arrange、Act、Assert 模式。

有什么方法可以执行类似的测试,其中断言可以与我的所有其他断言一起出现?目前,下面的代码位于 Arrange 中。

     myClass.Setup(
                x =>
                x.myMethod(
                    It.IsAny<Person>>(),
                    It.IsAny<string>(),
                    It.IsAny<Person>(),
                    It.IsAny<ICollection<string>>(),
                    It.IsAny<ICollection<string>>(),
                    It.IsAny<bool>())).Callback
                <Person, string, Person, Person, ICollection<string>, bool>(
                    (a, b, c, d, e, f) =>
                        { 
                            Assert.AreEqual("NameA", a.Name); 
                            Assert.AreEqual("StringB", b);
                            Assert.AreEqual("NameC", c.Name);
                            Assert.AreEqual(2, d);

                            var dList = d.ToList().OrderBy(x => x.Name);
                            Assert.AreEqual("PersonA", dList[0].Name)
                            Assert.AreEqual("PersonB", dList[1].Name);
                        });

我应该说,我知道您可以执行验证以检查是否已使用某些输入调用方法,但是我不知道有任何匹配 ICollection 参数的方法。

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    如果您使用这些断言来检查参数,则可以在您的设置中进行。如果你的 mock 使用严格的行为,如果参数与谓词不匹配,它将失败。

     // declare your mock with strict behavior
    
     myClass.Setup(
         x =>
         x.myMethod(
             It.Is<Person>(person => person.Name == "NameA"),
             "Stringb",
             It.Is<Person>(person => person.Name == "NameC"),,
             It.Is<ICollection<string>>(coll =>{ 
                    //your other validations
                }),
             It.IsAny<ICollection<string>>(),
             It.IsAny<bool>()));
    

    【讨论】:

      【解决方案2】:

      单元测试的目的是验证您的类的行为是否符合预期。您应该通过它的公共接口练习课程并检查以下内容:

      • 类状态变化
      • 返回结果
      • 对依赖项的调用

      当类按预期运行时,其他东西没有价值。您可以重构您的类并使该私有方法内联。

      【讨论】:

      • 您好,感谢您的评论。你是对的,我不应该测试私有方法。我在编写示例时犯了一个错误,它实际上是我试图测试的依赖关系。 Ufuk 给出的答案在这种情况下有所帮助。
      • @user460667 没问题,只是劝别人不要测试不该测试的东西:)
      猜你喜欢
      • 2013-08-18
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2020-03-14
      相关资源
      最近更新 更多