Pregunta

Estoy configurando algunas pruebas de RhinoMock pero no puedo entender por qué mis expectativas están fallando.

Aquí están las clases / interfaces que estoy probando:

public class LogOn {
    public virtual ILogOn View { get; set; }
    public virtual IDataProvider DataProvider { get; set; }

    public void SetUp(ILogOn view) {
        this.View = view;
        this.DataProvider = ... //using dependancy injection to do the data provider, so I want it faked in tests
    }
    public void SetUpEvents() {

        this.View.Submit += new EventHandler(View_Submit);
    }

    void View_Submit(object sender, EventArgs e) {
        if ( this.DataProvider.LogOn(this.Username) ) {
            this.View.SubmitSuccess();
        } else {
            this.View.SubmitFailure("Username is incorrect");
        }
    }
}

public interface ILogOn {
    string Username { get; set; }
    event EventHandler Submit;
    void SubmitSuccess();
    void SubmitFailure(string message);
}

Y aquí está mi método de prueba:

[TestMethod]
public void LogOnFailure() {
    var dataProvider = MockRepository.CreateStub<DataProvider>();
    var presenter = MockRepository.CreateMock<LogOn>();
    var view = MockRepository.CreateMock<ILogOn>();

    dataProvider.Expect(d => d.LogOn(null)).Return(true).Repeat.Any();

    presenter.Expect(p => p.DataProvider).Return(dataProvider).Repeat.Any();
    presenter.Expect(p => p.View).Return(view).Repeat.Any();
    presenter.Expect(p => p.SetUpEvents()).CallOriginalMethod();

    view.Expect(v => v.Username).Return("invalid").Repeat.Any();
    view.Expect(v => v.SubmitFail(null)).Constraints(Is.Same("Username is incorrect"));

    presenter.SetUp(view);
    presenter.SetUpEvents();

    view.Raise(v => v.Submit += null, null, EventArgs.Empty);

    presenter.VerifyAllExpectations();
    view.VerifyAllExpectations();
}

La expectativa de que está fallando es:

view.Expect(v => v.SubmitFail(null)).Constraints(Is.Same("Username is incorrect"));

(indicado por view.VerifyAllExpectations )

Dice que ese método nunca se ejecuta, pero al usar el depurador puedo pasar y se accede a LogOn.View , llama al método SubmitFailure (con eso argumento) y devolver correctamente.

No puedo averiguar qué falta, ya que ver el código indica que todo se ejecuta en el momento correcto y con los valores correctos.

Editar : Ok, así que dejé salir el código por lo que me estaba burlando de la clase LogOn , tiene una dependencia de un proveedor de datos externo (que yo ' Stubbing como no me importa cómo funciona). Mis disculpas, pensé que lo estaba haciendo más claro, ¡pero lo que acabo de hacer es peor!

¿Fue útil?

Solución

La clase LogOn es tu sistema bajo prueba, por lo que no debes burlarte de eso. Desea probar que la clase LogOn se comporte como debería en el caso de un nombre de usuario no válido. Puede determinar el comportamiento correcto pasando una vista simulada que configura el escenario que desea. Intenta cambiar tu prueba a lo que tengo a continuación.

[TestMethod]
public void LogonFailure()
{
    var presenter = new LogOn();
    var view = MockRepository.CreateMock<ILogOn>();

    view.Expect(v => v.Username).Return("invalid").Repeat.Any();
    view.Expect(v => v.SubmitFail(null)).Constraints(Is.Same("Username is incorrect"));

    presenter.Setup(view);

    view.Raise(v => v.Submit += null, null, EventArgs.Empty);

    view.VerifyAllExpectations();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top