Я пытаюсь протестировать презентатор, созданный с использованием ASP.NET WebFormsMVP. Я строю его с помощью шаблона «Контролирующий контроллер», поэтому View отвечает за обновление себя от модели. Я упростил следующий пример страницы с текстовым полем, кнопкой &. Вы вводите текстовое поле &, нажимая кнопку, и текст HelloWorld! <YOUR TEXT>
помещается на этикетке.Как я должен тестировать своих презентаторов WebFormMVP с представлениями Moq'd при использовании шаблона контрольного контроллера
Пример кода ниже, но в двух словах:
- button_click поднимет View Event.
- презентатор присоединяется к этой ViewEvent и ловит арг (т.е. сообщений)
- презентатор делает работу (конкатенацию) и обновляет модель
- вида на связывание всех собственность Model.Message & всего это работает хорошо.
//Model
public class HelloWorldModel {
public string Message { get; set; }
}
//Args
public class HelloWorldEventArgs : EventArgs {
public string Message { get; set; }
}
//View
public interface IHelloWorldView : IView<HelloWorldModel> {
event EventHandler<HelloWorldEventArgs> SendMessage;
}
//Presenter
public class HelloWorldPresenter : Presenter<IHelloWorldView>
{
private readonly EventHandler<HelloWorldEventArgs> SendMessageDelegate;
public HelloWorldPresenter(IHelloWorldView view) : base(view)
{
SendMessageDelegate = ((s, e) => SendMessageReceived(e.Message));
View.SendMessage += SendMessageDelegate;
}
public override void ReleaseView()
{
View.SendMessage -= SendMessageDelegate;
}
public void SendMessageReceived(string message)
{
View.Model.Message = string.Format("Hello World! - {0}", message);
}
}
//View implementation
[PresenterBinding(typeof(HelloWorldPresenter))]
public partial class HelloWorld : MvpPage<HelloWorldModel>,IHelloWorldView
{
protected void EchoButtonClick(object sender, EventArgs e)
{
if(SendMessage != null)
{
var args = new HelloWorldEventArgs {Message = MessageTextBox.Text};
SendMessage(sender, args);
}
}
public event EventHandler<HelloWorldEventArgs> SendMessage;
}
Моя проблема заключается в тестировании, хотя.
Поскольку представление отвечает за обновление себя от модели, Presenter устанавливает только свойство Model.Message ... поэтому в модульном тесте я хочу сделать следующее.
- Mock мой
IHelloWorldView
- Инстанцировать мой Present с Мок.
- Запуск события на макете
- Убедитесь, что в настоящий момент задано свойство Model.Message для Mock.
[TestMethod]
public void TestMethod1()
{
var input = "My Message";
var expected = string.Format("Hello World! - {0}", input);
var mock = new Mock<IHelloWorldView>
{
DefaultValue = DefaultValue.Mock
};
var pres = new HelloWorldPresenter(mock.Object);
mock.Raise(m =>
m.SendMessage += null,
new HelloWorldEventArgs { Message = input });
mock.VerifySet(view =>
view.Model.Message = It.Is<string>(s => s == expected),
Times.Once());
}
Но это не будет работать, если я не в явной форме отметить Message
свойство моей модели как виртуальный, который я не хочу делать. например
//Model
public class HelloWorldModel {
public string Message { get; set; }
}
Мой Другой вариант заключается в использовании Passive View Pattern и разоблачить жерех: ярлык текста в виде строкового собственности на IHelloWorldView и установить, что непосредственно из Presenter ... и тогда я должен быть в состоянии проверить его ,
- Is Passive Посмотреть лучший подход с точки зрения тестирования?
- Нужно, что я должен либо же Макет моей модели (который я не уверен, что это возможно в WebFormsMVP? ИЛИ
- Что мне нужно сделать все свойства моей модели виртуального ИЛИ
- Я пропустил какой-то пункт где-то?
Спасибо. Это упрощает ситуацию. –