2010-04-25 2 views
0

Я новичок в MOq и я пытался проверить контроллер (MVC) поведение, когда вид вызывает определенное событие, контроллер вызывает определенную функцию на модели, здесь классы -Test MVC с помощью MOQ

public class Model 
{ 
    public void CalculateAverage() 
    { 
     ... 
    } 

    ... 
} 

public class View 
{ 
    public event EventHandler CalculateAverage; 

    private void RaiseCalculateAverage() 
    { 
     if (CalculateAverage != null) 
     { 
      CalculateAverage(this, EventArgs.Empty); 
     } 
    } 

    ... 
} 

public class Controller 
{ 
    private Model model; 
    private View view; 

    public Controller(Model model, View view) 
    { 
     this.model = model 
     this.view = view; 
     view.CalculaeAverage += view_CalculateAverage; 
    } 

    priavate void view_CalculateAverage(object sender, EventArgs args) 
    { 
     model.CalculateAverage(); 
    } 
} 

и тест -

[Test] 
public void ModelCalculateAverageCalled() 
{ 
    Mock<Model> modelMock = new Mock<Model>(); 
    Mock<View> viewMock = new Mock<View>(); 
    Controller controller = new Controller(modelMock.Object, viewMock.Object); 
    viewMock.Raise(x => x.CalculateAverage += null, new EventArgs.Empty); 
    modelMock.Verify(x => x.CalculateAverage()); 
    //never comes here, test fails in above line and exits 
    Assert.True(true); 
} 

вопрос заключается в том, что испытание терпит неудачу во второй последней строке с «Призывание не было выполнено на макете: х => x.CalculateAverage()». Еще одна вещь, которую я заметил, это то, что тест заканчивается на этой второй последней строке, и последняя строка никогда не выполняется. Я все делаю правильно?

ответ

2

Ниже вы найдете рабочий фрагмент. Разница в том, что «CalculateAverage» объявляется виртуальным. Причина в том, что Moq создает среду выполнения поверх классов «Mock» и переопределяет ее beheviour. Но если метод не виртуальный, то это просто невозможно.

public class Model 
    { 
     public virtual void CalculateAverage() 
     { 
     } 
    } 

    public class View 
    { 
     public virtual event EventHandler CalculateAverage; 
    } 

    public class Controller 
    { 
     private Model model; 
     private View view; 

     public Controller(Model model, View view) 
     { 
      this.model = model; 
      this.view = view; 
      view.CalculateAverage += view_CalculateAverage; 
     } 

     private void view_CalculateAverage(object sender, EventArgs args) 
     { 
      model.CalculateAverage(); 
     } 
    } 

    [TestFixture] 
    public class MvcTest 
    { 
     [Test] 
     public void ModelCalculateAverageCalled() 
     { 
      var modelMock = new Mock<Model>(); 
      var viewMock = new Mock<View>(); 

      var controller = new Controller(modelMock.Object, viewMock.Object); 

      viewMock.Raise(x => x.CalculateAverage += null, EventArgs.Empty); 
      modelMock.Verify(x => x.CalculateAverage()); 
     } 
    } 
Смежные вопросы