2011-11-28 60 views
0

失败时我在我的NUnit测试下面的代码:起订量VerifySet使用接口的属性设置

[Test] 
    public void SmtpSend_UsingSystemCredentials_SetsSmtpClientCredentials() 
    { 
     const string smtppwd = "smtppwd"; 
     const string smtpuser = "smtpuser"; 
     const string smtphost = "smtphost"; 
     const int smtpport = 333; 

     _emailManager.Setup(x => x.ValidateSmtpSettings()).Returns(true); 
     _emailTransportConfig.SetupGet(x => x.SmtpPassword).Returns(smtppwd); 
     _emailTransportConfig.SetupGet(x => x.SmtpUsername).Returns(smtpuser); 
     _emailTransportConfig.SetupGet(x => x.SmtpHost).Returns(smtphost); 
     _emailTransportConfig.SetupGet(x => x.SmtpPort).Returns(smtpport);    
     _smtpClient.SetupAllProperties(); 

     _smtpHandler.Send(null, "[email protected]", "[email protected]", "subject", "body", true); 
     _smtpClient.VerifySet(x => x.Port = smtpport); 
     _smtpClient.VerifySet(x => x.Host = smtphost); 

     // Todo Why is this not working? 
     _smtpClient.VerifySet(x => x.Credentials = new NetworkCredential(smtpuser, smtppwd)); 
    } 

我可以看到代码落入这样的功能:

private void SetSystemSmtpAccountSettings() 
    {   
     _smtpClient.Credentials = new NetworkCredential 
     { 
      UserName = _emailTransportConfig.SmtpUsername, 
      Password = _emailTransportConfig.SmtpPassword 
     }; 
     _smtpClient.Host = _emailTransportConfig.SmtpHost; 
     _smtpClient.Port = _emailTransportConfig.SmtpPort; 
    } 

但我有什么不明白为什么VerifySet调用失败。

回答

1

正如@Daz刘易斯说,你VerifySet是针对不同的情况下检查。相反,尝试使用It.Is火柴表达式:

_smtpClient.VerifySet(x => x.Credentials = It.Is<NetworkCredential>(c => c.UserName == smtpuser && c.Password == smtppwd)); 
+0

这工作完美,谢谢! – jaffa

2

你是代码示例可以使用一些澄清,但我相信你的问题在于试图对new NetworkCredential实例进行验证,该实例不是在测试方法中设置的实际实例,因此验证失败。看起来您正在尝试验证用户名和密码是否在Credentials属性上正确设置。这是一个基于状态的测试中更容易与一对夫妇断言的验证:

Assert.IsNotNull(_smtpClient.Credentials); 
Assert.AreEqual(_smtpClient.Credentials.UserName, smtpuser); 
Assert.AreEqual(_smtpClient.Credentials.Password, smtppwd); 
+0

嗨,我无法测试上述,因为_smtpClient是一个Mocked对象。我认为你无法对NetworkCredential实例进行测试是正确的。我如何解决特定问题?我正在测试客户端对象是从一个模拟对象获取属性,并针对另一个模拟对象进行设置。它只是NetworkCredential行不起作用。其他SetupGet/VerifySet对正常工作。 – jaffa

+0

查看@ adrift的回答 - Daz是正确的,那就可以解决它。 – TrueWill

0

我有类似的情况,但使用的工厂,所以拥有凭据类是一个模拟。

mockCreate = new Mock<IWebRequestCreate>(); 
mockRequest = new Mock<WebRequest>(); 
mockCreate.Setup(x => x.Create(It.IsAny<Uri>())) 
       .Returns(mockRequest.Object); 
webrequest = new HTTPRequestFactory(mockCreate.Object); 
mockRequest.SetupProperty(mr => mr.Credentials); 
mockRequest.SetupProperty(mr => mr.Credentials.UserName); 
mockRequest.SetupProperty(mr => mr.Credentials.Password); 

//setup username and password and send to factory 
WebResponse response = webrequest.GetWebResponse(testURI); 
mockCreate.VerifyAll(); 
mockRequest.VerifySet(mr => mr.Credentials = It.Is<NetworkCredential>(c => c.UserName == "user" && c.Password == "password")); 
Assert.AreEqual("user", mockRequest.Object.Credentials.UserName); 
Assert.AreEqual("user", mockRequest.Object.Credentials.Password); 

adrifts answer works,Daz's will not compile。有关何处寻找的任何提示可以更多地了解原因?智能感知说这是因为ICredentials没有定义UserNamePassword