Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Moq-mock.Raise应该在没有设置的情况下在测试单元中引发事件_C#_Events_Tdd_Moq_Mvp - Fatal编程技术网

C# Moq-mock.Raise应该在没有设置的情况下在测试单元中引发事件

C# Moq-mock.Raise应该在没有设置的情况下在测试单元中引发事件,c#,events,tdd,moq,mvp,C#,Events,Tdd,Moq,Mvp,我有一个presenter类,它附加了一个注入视图的事件。 现在我想测试演示者对事件的正确反应 这是视图界面IView: public interface IView { event EventHandler MyEvent; void UpdateView(string test); } 这就是实现IView的观点 public partial class MyView : IView { public event EventHandler MyEvent;

我有一个presenter类,它附加了一个注入视图的事件。 现在我想测试演示者对事件的正确反应

这是视图界面IView:

public interface IView 
{
    event EventHandler MyEvent;
    void UpdateView(string test);
}
这就是实现IView的观点

public partial class MyView : IView
{
    public event EventHandler MyEvent;

    public MyView()
    {
        this.combo.SelectedIndexChanged += this.OnSelectedIndexChanged;
    }

    public void UpdateView(string test)
    {
        this.textBox.Text = test;
    }

    private OnSelectedIndexChanged(Object sender, EventArgs e)
    {
        if (this.MyEvent != null)
        {
            this.MyEvent(sender, e);
        }
    }
}
这是测试中的演示者:

public class MyPresenter
{
    private IView _view;
    public MyPresenter(IView view)
    {
        this._view = view;
        this._view.MyEvent += this.OnMyEvent;
    }

    private void OnMyEvent(Object sender, EventArgs e)
    {
        this._view.UpdateView();
    }
}
这是测试夹具测试MyPresenter:

[TestClass]
public class MyPresenterFixture()
{
    private MyPresenter testee;
    private Mock<IView> mockView;

    [TestMethod]
    public void ShouldReactOnMyEvent()
    {
        // arrange
        this.mockView = new Mock<IView>(MockBehavior.Strict);
        this.testee = new MyPresenter(this.mockView.Object);

        // act
        this.mockView.Raise(mock => mock.MyEvent += null); // this does not fire

        // assert and verify
        this.mockView.Verify(mock => mock.UpdateView(It.IsAny<string>());
    }
}
[TestClass]
公共类MyPresenterFixture()
{
私人MyPresenter受试者;
私有模拟视图;
[测试方法]
public void shouldReactionMyEvent()
{
//安排
this.mockView=newmock(MockBehavior.Strict);
this.testee=新的MyPresenter(this.mockView.Object);
//表演
this.mockView.Raise(mock=>mock.MyEvent+=null);//这不会触发
//断言和验证
验证(mock=>mock.UpdateView(It.IsAny());
}
}
我正在使用最小起订量4。有可能做我想做的吗

致意 Yannik

您已声明UpdateView()接受字符串,但您的presenter调用没有字符串参数(或默认值):

调用:

private void OnMyEvent(Object sender, EventArgs e)
{
    this._view.UpdateView();
}
声明:

public void UpdateView(string test)
{
    this.textBox.Text = test;
}
核查:

mockView.Verify(mock => mock.UpdateView(It.IsAny<string>());
然后,您可以验证与视图的交互,而无需处理其他事件:

    presenter.SelectItem("Burrito!");

    mockView.Verify(mock => mock.UpdateView("Burrito!");

您不需要传递参数吗?您的事件签名是
EventHandler
,即
(对象发送方,事件参数e)


我从未使用过您在此处指定的重载…但它似乎不正确。

Hi Ritch,感谢您的反馈。我在presenters方法private void OnMyEvent(Object sender,EventArgs e)中看到过这一点{this.\u view.UpdateView();}UpdateView的输入丢失。不幸的是,您的方法不适用于我们,因为我们实现了纯被动视图,并且视图从不知道其演示者。Cheers+1。或传入EventArgs.Empty。您需要将发件人之外的任何参数作为参数传递给Mock.Raise。链接我们为什么使用Mock.MyEvent+=null??请我是一个傻瓜,为什么我们要使用mock.MyEvent+=null??@Anderson-Imes
    presenter.SelectItem("Burrito!");

    mockView.Verify(mock => mock.UpdateView("Burrito!");
this.mockView.Raise(mock => mock.MyEvent += null, new EventArgs());