2012-01-30 2 views
4

Я пытаюсь протестировать презентатор, созданный с использованием ASP.NET WebFormsMVP. Я строю его с помощью шаблона «Контролирующий контроллер», поэтому View отвечает за обновление себя от модели. Я упростил следующий пример страницы с текстовым полем, кнопкой &. Вы вводите текстовое поле &, нажимая кнопку, и текст HelloWorld! <YOUR TEXT> помещается на этикетке.Как я должен тестировать своих презентаторов WebFormMVP с представлениями Moq'd при использовании шаблона контрольного контроллера

Пример кода ниже, но в двух словах:

  1. button_click поднимет View Event.
  2. презентатор присоединяется к этой ViewEvent и ловит арг (т.е. сообщений)
  3. презентатор делает работу (конкатенацию) и обновляет модель
  4. вида на связывание всех собственность 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 ... поэтому в модульном тесте я хочу сделать следующее.

  1. Mock мой IHelloWorldView
  2. Инстанцировать мой Present с Мок.
  3. Запуск события на макете
  4. Убедитесь, что в настоящий момент задано свойство 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 ... и тогда я должен быть в состоянии проверить его ,

  1. Is Passive Посмотреть лучший подход с точки зрения тестирования?
  2. Нужно, что я должен либо же Макет моей модели (который я не уверен, что это возможно в WebFormsMVP? ИЛИ
  3. Что мне нужно сделать все свойства моей модели виртуального ИЛИ
  4. Я пропустил какой-то пункт где-то?

ответ

1

Вы настраиваете вид-макет с DefaultValue.Mock, поэтому ваш вид будет иметь инициализированное свойство модели.Вместо того, чтобы использовать Moq для проверки значения модели, просто проверить сообщение непосредственно на модели:

Assert.That(mock.Object.Model.Message, Is.EqualTo(expected)); 

Красота этих небольших (но семантический равных) изменений в том, что ваш макет вдруг становится окурком и ваши, конечный результат тестирования вместо подробных подробностей реализации nitty gritty. Что касается ваших вопросов, то неплохо было бы спроектировать вашу систему с точки зрения тестируемости, но я бы не стал виртуализировать или интерфейсы всего, чтобы сделать его удобным для Moq; сделать SOLID-архитектуру, не обязательно Moq-able.

+0

Спасибо. Это упрощает ситуацию. –

 Смежные вопросы

  • Нет связанных вопросов^_^