有没有更好的方法用Moq编写这个测试?

时间:2012-04-17 13:48:55

标签: c# unit-testing moq

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

有没有办法可以执行类似的测试,其中assert可以出现在我的所有其他断言中?目前,下面的代码属于安排。

     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参数的方法。

2 个答案:

答案 0 :(得分:3)

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

 // 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>()));

答案 1 :(得分:2)

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

  • 班级状态变更
  • 返回结果
  • 调用依赖项

当类的行为与预期一样时,其他东西没有价值。您可以重构您的类并使该私有方法在线。