我希望能够测试对象是否订阅了某个事件。在Rhino Mocks中,下面的代码验证了这一点,但是我找不到在Moq中执行此操作的方法。
public class Presenter
{
IView view;
public Presenter(IView view)
{
this.view = view;
this.view.Load += new EventHandler(view_Load);
}
void view_Load(object sender, EventArgs e)
{
throw new Exception("Not implemented.");
}
}
[Test]
public void VerifyAttachesToViewEvents()
{
MockRepository mocks = new MockRepository();
IView viewMock = (IView)mocks.CreateMock(typeof(IView));
using (mocks.Record())
{
viewMock.Load += null;
LastCall.IgnoreArguments();
}
new Presenter(viewMock);
mocks.VerifyAll();
}
答案 0 :(得分:1)
我会提出事件并验证是否抛出了异常。无论如何,您可能需要检查SUT中的某些逻辑是否被执行,而不仅仅是订阅了一个事件:
[Test]
public void VerifyAttachesToViewEvents()
{
// arrange
var mock = new Mock<IView>();
new Presenter(mock.Object);
// act
Action action = () => mock.Raise(view => view.Load += null, EventArgs.Empty);
// assert
action.ShouldThrow<Exception>()
.WithMessage("Not implemented.");
}
我不确定您使用的是哪个单元测试框架,因此在assert部分中使用了fluent assertions。如果您使用NUnit,代码可能是:
[Test]
public void VerifyAttachesToViewEvents()
{
// arrange
var mock = new Mock<IView>();
new Presenter(mock.Object);
// act & assert
Assert.Throws<Exception>(() =>
mock.Raise(view => view.Load += null, EventArgs.Empty));
}
答案 1 :(得分:1)