Я настраиваю некоторые тесты 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
, у него есть зависимость от внешнего провайдера данных (о чем я и говорю все равно, как это работает). Мои извинения, я думал, что делаю это яснее, но только что сделал хуже!