2012-04-17 127 views
1

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

有没有什么方法可以执行类似的测试,其中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); 
         }); 

我应该说,我知道,你可以perfom校验来检查方法是否调用了一定的投入,但我不知道的匹配ICollection的则params的任何方式。

回答

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

单元测试的目的是验证你的类的行为如预期。你应该通过公共接口健美班,并检查以下几件事:

  • 类状态改变
  • 返回的结果
  • 调用依赖

其他的东西没有价值,而类的行为预期。您可以重构您的课堂,并使该内部方法联机。

+0

嗨,感谢您的评论。你是对的,我不应该测试私人方法。编写示例时我犯了一个错误,它实际上是我试图测试的一个依赖。 Ufuk给出的答案在这种情况下有所帮助。 – user460667 2012-04-17 14:22:39

+0

@ user460667没问题,只是建议别人不要测试什么不应该测试:) – 2012-04-17 14:31:43

相关问题