Diferencia en las técnicas para establecer el valor de retorno de un método apagó con burla de Rhino

StackOverflow https://stackoverflow.com/questions/2911467

Pregunta

¿Cuál es la principal diferencia entre estas dos formas siguientes para dar un método alguna aplicación falsa?

Yo estaba usando la segunda manera fina en una prueba, pero en otra prueba el comportamiento no puede lograrse a menos que vaya con el primer camino.

so (la primera),

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

vs (la segunda).

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

Editar

El problema es que la segunda técnica retornos nulos en la prueba, cuando espero que vuelva un nuevo LoginUser. La primera técnica se comporta como se esperaba, devolviendo una nueva LoginUser. Todo otro código de prueba utilizado en ambos casos es idéntico.

[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;
    }
}

Podría ser algo que ver con la sobrecarga en la interfaz, tal vez?

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

La línea que causa el problema en el método bajo prueba es:

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

En el modo de depuración, identity.Name nunca es nula y es siempre "dummyName"

¿Fue útil?

Solución

El segundo método es el nuevo AAA sintaxis , y es el método preferido. Tal vez podría ampliarse en los problemas que tuvo con la sintaxis de AAA, y es posible que pueda obtener ayuda para arreglar ese problema.

EDIT:

¿Está seguro de que el método está siendo llamado con ese parámetro? ¿Qué ocurre si se utiliza

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

Qué se obtiene nada volvió?

Lo que si se establece una expectativa en lugar de simplemente apagando y luego verificar la expectativa, la fuerza que le dan algo más de información?

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

Edit2:

ok lo hice un poco de prueba y parece que es la forma en que está creando el objeto trozo. Asumo que la forma en que está utilizando es para el viejo estilo y que tiene que utilizar esto para el nuevo estilo:

service = MockRepository.GenerateStub<IMembershipService>();

Cuando cambié a esto puedo ejecutar las pruebas y conseguir que pasan. No estoy seguro de la diferencia exacta entre el uso del método estático para generar el talón y el uso de la instancia MockRepository prueba. Tal vez alguien puede explicar los pormenores de la misma.

De todos modos está completo aquí está el código RAN I que trabajó:

[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
    {
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top