Почему это ожидание не удается? - PullRequest
1 голос
/ 30 июля 2009

Я настраиваю некоторые тесты RhinoMock, но не могу понять, почему мои ожидания не оправдываются.

Вот класс / интерфейс, который я тестирую:

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

А вот мой метод испытаний:

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

Неудачное ожидание:

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

(обозначено view.VerifyAllExpectations)

В нем говорится, что этот метод никогда не выполняется, но при использовании отладчика я могу пройти через него и получить доступ к LogOn.View, вызвать метод SubmitFailure (с этим аргументом) и вернуться правильно.

Я не могу понять, чего не хватает, так как просмотр кода показывает, что все выполняется в нужное время и с правильными значениями.

Редактировать : Хорошо, поэтому я выпустил код, поэтому я издевался над классом LogOn, у него есть зависимость от внешнего провайдера данных (о чем я и говорю все равно, как это работает). Мои извинения, я думал, что делаю это яснее, но только что сделал хуже!

1 Ответ

1 голос
/ 30 июля 2009

Класс LogOn - это тестируемая вами система, поэтому вам не следует над этим издеваться. Вы хотите проверить, что класс LogOn ведет себя так же, как и в случае неверного имени пользователя. Вы можете определить правильное поведение, передав имитированное представление, которое устанавливает желаемый сценарий. Попробуйте изменить свой тест на то, что у меня ниже.

[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();
}
...