我有一个设置属性的方法
public void SetNetworkCredential(string userName, string password, string domain)
{
_reportExecutionService.Credentials = new NetworkCredential(userName, password, domain);
}
如何验证是否使用有效的NetworkCredential调用了凭据?
我尝试过这个TestMethod,但它失败了,因为NetworkCredential对象是不同的引用
[TestMethod]
public void TestTest()
{
const string userName = "userName";
const string password = "password";
const string domain = "domain";
var mock = MockRepository.GenerateMock<IReportExecutionService>();
var rptService= new ReportService(mock);
rptService.SetNetworkCredential(userName, password, domain);
mock.AssertWasCalled(x => x.Credentials = new System.Net.NetworkCredential(userName, password, domain));
}
有没有办法验证使用NetworkCredential类型的对象并使用正确的参数调用setter?
答案 0 :(得分:15)
我通过使ReportService接受网络凭据而不是用户名,密码,域
来修复它public void SetNetworkCredential(NetworkCredential networkCredential)
{
_reportExecutionService.Credentials = networkCredential;
}
所以我的测试更容易
[TestMethod]
public void TestTest()
{
const string userName = "userName";
const string password = "password";
const string domain = "domain";
var mock = MockRepository.GenerateMock<IReportExecutionService>();
var rptService= new ReportService(mock);
var networkCredential = new System.Net.NetworkCredential(userName, password, domain);
rptService.SetNetworkCredential(networkCredential);
mock.AssertWasCalled(x => x.Credentials = networkCredential);
}
答案 1 :(得分:3)
编辑:重新思考此问题,我之前建议的答案可能无效。原因如下:
实际上,您正在尝试验证是否已正确设置依赖项的依赖项。这可能就是为什么你在为此编写单元测试时遇到问题。您可能想要考虑将SetNetworkCredential
方法移动到实现IReportExecutionService
的类中是否有意义。
如果你这样做,那个方法的单元测试就足够简单了:
[Test]
public void TestSetNetworkCredential()
{
const string userName = "userName";
const string password = "password";
const string domain = "domain";
var rptService= new ReportExecutionService();
rptService.SetNetworkCredential(userName, password, domain);
Assert.AreEqual(userName, rptService.Credentials.UserName);
Assert.AreEqual(password, rptService.Credentials.Password);
Assert.AreEqual(domain, rptService.Credentials.Domain);
}