Разница в методах установки возвращаемого значения заглушенного метода с помощью Rhino Mocks - PullRequest
2 голосов
/ 26 мая 2010

В чем основное различие между этими двумя способами для придания методу ложной реализации?

Я использовал второй способ штрафа в одном тесте, но в другом тесте поведение не может быть достигнуто, если я пойду с первым путем.

т. (Первый),

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

против (второй).

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

Редактировать

Проблема в том, что второй метод возвращает нуль в тесте, когда я ожидаю, что он вернет нового 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"

1 Ответ

3 голосов
/ 26 мая 2010

второй метод - новый AAA-синтаксис , и он является предпочтительным методом. Возможно, вы могли бы расширить проблемы, которые у вас были, используя синтаксис AAA, и вы могли бы получить помощь в устранении этой проблемы.

EDIT:

Вы уверены, что метод вызывается с этим параметром? Что произойдет, если вы используете

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

EDIT2:

Хорошо, я провел небольшое тестирование, и похоже, что именно так вы создаете объект-заглушку. Я предполагаю, что вы используете старый стиль и вам нужно использовать его для нового стиля:

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
    {
    }
...