首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在moq中引发事件操作

在moq中引发事件操作
EN

Stack Overflow用户
提问于 2017-08-09 12:28:46
回答 2查看 1.7K关注 0票数 0

我的结构如下。我想测试一下在触发ViewLoaded事件时是否调用了LoadData

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface ISetupView
{
    event Action ViewLoaded;
}

public class BaseSetupController
{
    private ISetupView view;

    public BaseSetupController(ISetupView view)
    {
        this.view = view;
        view.ViewLoaded += () => { LoadData(); };
    }

    public virtual void LoadData()
    {

    }
}

目前我有类似下面的测试,但它不工作。它声明永远不会调用LoadData

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[TestFixture]
public class BaseSetupControllerTests
{
    [Test]
    public void ViewLoad_LoadDataIsCalled()
    {
        Mock<ISetupView> view = new Mock<ISetupView>();
        Mock<BaseSetupController> controller = new Mock<BaseSetupController>(view.Object);
        controller.Setup(x => x.LoadData());
        view.Raise(x => x.ViewLoaded += () => { });
        controller.Verify(x=>x.LoadData(), Times.Once());
    }
}
EN

回答 2

Stack Overflow用户

发布于 2017-08-09 12:55:42

在引发event之前,我似乎只需要创建controller.Object

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var obj = controller.Object;
view.Raise(x=>x.ViewLoaded+=null);
票数 0
EN

Stack Overflow用户

发布于 2017-08-09 12:56:20

设置事件处理程序发生在构造函数中,如果您只是模拟对象,则不会调用该构造函数。

在单元测试中,您有一个具体的类。它的依赖关系就是你所模仿的。模拟它们基本上只测试模拟框架,而不是测试您的类。

由于您希望测试是否调用了LoadData,因此您可能会对事件处理程序是否设置为LoadData感兴趣。除非您怀疑.NET框架本身,否则在引发事件时实际调用LoadData是必然的。

This question discusses verifying whether an event has a specific subscriber.,但它需要反射,而且不容易。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45590743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文