Подтвердить что ты не робот

Поднятие событий из макета/заглушки с использованием Rhino Mocks

Как я могу поднять событие из макета/заглушки с помощью Rhino Mocks?

Я нашел ответы на этот вопрос в Интернете, но все они, похоже, используют синтаксис Record/Replay, но я использую синтаксис Arrange/Act/Assert.

Любые предложения?

Маленький пример...

Скажем, я использую шаблон MVVM и имею этот класс модели:

public class MyModel
{
    private int _myValue;

    public event EventHandler ValueChanged;

    public void SetValue(int newValue)
    {
        _myValue = newValue;
        if (ValueChanged != null)
        {
            ValueChanged(this, null);
        }
    }
}

Как вы видите, класс имеет целочисленное значение и метод, который его устанавливает. Когда значение установлено, происходит событие ValueChanged.

Этот класс модели используется viewmodel:

public class MyViewModel
{
    private MyModel _myModel;

    public MyViewModel(MyModel myModel)
    {
        _myModel = myModel;
        _myModel.ValueChanged += ValueChangedHandler;
    }

    private void ValueChangedHandler(object sender, EventArgs e)
    {
        MyString = "Value has changed";
    }

    public string MyString { get; set; }
}

Эта модель просмотра прослушивает событие ValueChanged на модели и обновляет ее при поднятии.

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

[TestMethod]
public void MyViewModel_ModelRaisesValueChangedEvent_MyStringIsUpdated()
{
    //Arrange.
    var modelStub = MockRepository.GenerateStub<MyModel>();
    MyViewModel viewModel = new MyViewModel(modelStub);

    //Act
    -HERE I WANT TO RAISE THE VALUE CHANGED EVENT FROM modelStub.

    //Assert.
    Assert.AreEqual("Value has changed", viewModel.MyString);
}

Обратите внимание, что это всего лишь пример, а не мой фактический код (что более сложно). Надеюсь, вы можете игнорировать любые опечатки и другие мелкие ошибки.

4b9b3361

Ответ 1

[TestMethod]
public void MyViewModel_ModelRaisesValueChangedEvent_MyStringIsUpdated()
{
    //Arrange.
    var modelStub = MockRepository.GenerateStub<IModel>();
    MyViewModel viewModel = new MyViewModel(modelStub);

    //Act
    modelStub.Raise(
       x => x.ValueChanged += null,
       modelStub, // sender
       EventArgs.Empty);

    //Assert.
    Assert.AreEqual("Value has changed", viewModel.MyString);
}

Изменить: Ошибка, с которой вы сталкиваетесь, возможно, может быть решена путем изменения типа заглушки на интерфейс IModel (как работают мои собственные тесты). Я изменил его в приведенном выше примере, но вам также придется изменить объявление конструктора MyViewModel, чтобы получить тип интерфейса.

Добавление ключевого слова virtual в объявление события также может работать.