2

下面这两种给方法一些假实现的方法之间的主要区别是什么?

我在一个测试中使用第二种方式很好,但在另一个测试中,除非我使用第一种方式,否则无法实现行为。

所以(第一个),

using (test.Record()) //test is MockRepository instance
{
 service.GetUser("dummyName");
 LastCall.Return(new LoginUser());
}

vs(第二个)。

service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser());

编辑

问题是第二种技术在测试中返回 null,而我希望它返回一个新的 LoginUser。第一种技术通过返回一个新的 LoginUser 来按预期运行。在这两种情况下使用的所有其他测试代码都是相同的。

[TestFixture]
public class AuthorizationTest
{
    private MockRepository test;
    private IMembershipService service;

    [SetUp]
    public void SetUp()
    {
        test = new MockRepository();
        service = test.Stub<IMembershipService>();

        using (test.Record())
        {
            service.GetUser("dummyName");
            LastCall.Return(new LoginUser());
        }

        //service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser()); 
    }

    [Test]
    public void GetCurrentUser_UserIsAuthenticated_ReturnsCurrentUser()
    {
        var authStub = new AuthorizationStub_SetCurrentUserAuthenticated(service, true);

        LoginUser u = authStub.GetCurrentUser();
        Assert.That(u != null);
    }

    [TearDown]
    public void TearDown()
    {
        service = null;
        test = null;
    }
}

可能与界面中的过载有关吗?

public interface IMembershipService
{
    bool ChangePassword(string username, string oldPassword, string newPassword);
    LoginUser GetUser(string username);
    LoginUser GetUser(object providerUserKey);
    string ResetPassword(string username);
    bool ValidateUser(string username, string password);
}

在被测方法中导致问题的行是:

LoginUser currentUser = _repository.GetUser(identity.Name);

在调试模式下,identity.Name 永远不会为空,并且始终是“dummyName”

4

1 回答 1

3

第二种方法是新的AAA 语法,是首选方法。也许您可以扩展使用 AAA 语法时遇到的问题,并且您可能能够获得解决该问题的帮助。

编辑:

您确定使用该参数调用该方法吗?如果你使用会发生什么

 service.Stub(r => r.GetUser(Arg<String>.Is.Anything)).Return(new LoginUser());

你有什么退还的吗?

如果你设定一个期望值而不是简单地把它存根然后验证期望值,那会不会给你更多的信息呢?

service.Expect(r => r.GetUser(Arg<String>.Is.Anything)).Return(new LoginUser());
service.VerifyAllExpectations();

编辑2:

好的,我做了一些测试,这似乎是您创建存根对象的方式。我假设您使用的方式是旧样式,并且您需要将其用于新样式:

service = MockRepository.GenerateStub<IMembershipService>();

当我更改为这个时,我可以运行测试并让它们通过。我不确定使用静态方法生成存根和使用测试MockRepository实例之间的确切区别。也许其他人可以解释它的来龙去脉。

无论如何,为了完整起见,这里是我运行的代码:

[TestFixture]
public class AuthorizationTest
    {
    private IMembershipService service;

    [SetUp]
    public void SetUp()
        {
        service = MockRepository.GenerateStub<IMembershipService>();
        service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser()); 
        }

    [Test]
    public void GetCurrentUser_UserIsAuthenticated_ReturnsCurrentUser()
        {
        var authStub = new AuthorizationStub_SetCurrentUserAuthenticated(service, true);

        LoginUser u = authStub.GetCurrentUser();
        Assert.That(u != null);
        }

    [TearDown]
    public void TearDown()
        {
        service = null;
        }
    }

public class AuthorizationStub_SetCurrentUserAuthenticated
    {
    private readonly IMembershipService m_service;
    private readonly bool m_b;

    public AuthorizationStub_SetCurrentUserAuthenticated (IMembershipService service, bool b)
        {
        m_service = service;
        m_b = b;
        }

    public LoginUser GetCurrentUser ()
        {
        return m_service.GetUser ("dummyName");
        }
    }

public interface IMembershipService
    {
    bool ChangePassword(string username, string oldPassword, string newPassword);
    LoginUser GetUser(string username);
    LoginUser GetUser(object providerUserKey);
    string ResetPassword(string username);
    bool ValidateUser(string username, string password);
    }

public class LoginUser
    {
    }
于 2010-05-26T10:13:05.770 回答