使用正确的对象类型调用Rhino Mocks Assert属性Setter

时间:2009-07-30 23:13:09

标签: rhino-mocks

我有一个设置属性的方法

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?

2 个答案:

答案 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);
}