我的结构如下。我想测试一下在触发ViewLoaded
事件时是否调用了LoadData
。
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
。
[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());
}
}
发布于 2017-08-09 12:55:42
在引发event之前,我似乎只需要创建controller.Object
:
var obj = controller.Object;
view.Raise(x=>x.ViewLoaded+=null);
发布于 2017-08-09 12:56:20
设置事件处理程序发生在构造函数中,如果您只是模拟对象,则不会调用该构造函数。
在单元测试中,您有一个具体的类。它的依赖关系就是你所模仿的。模拟它们基本上只测试模拟框架,而不是测试您的类。
由于您希望测试是否调用了LoadData,因此您可能会对事件处理程序是否设置为LoadData感兴趣。除非您怀疑.NET框架本身,否则在引发事件时实际调用LoadData是必然的。
This question discusses verifying whether an event has a specific subscriber.,但它需要反射,而且不容易。
https://stackoverflow.com/questions/45590743
复制相似问题