我如何测试是否已收到 MVVM 轻量级消息并对其采取行动?
How can I test that an MVVM light message has been received and acted upon?
我有一个派生的 class,它通过 属性 注入获取对象并在该对象的信使上注册:
public class Foo : AbsFoo
{
private IBar bar;
public override IBar Bar
{
get {return bar;}
set
{
bar = value
if(bar != null)
{
bar.Messenger.Register<MyMessage>(this, m => SomeMethod());
}
}
}
public override void SomeMethod()
{
//..
}
}
基本上,我想设置Bar
,发送消息,并验证是否调用了SomeMethod()
。
我的测试是这样的:
var fixture = new Fixture();
fixture.Customize(new AutoConfiguredMoqCustomization());
var messenger = new Messenger();
var barFixture = fixture.Create<IBar>();
barFixture.Messenger = messenger
var fooMock = new Mock<Foo> {CallBase = true};
fooMock.SetupAllProperties();
fooMock.Object.Bar = barFixture;
fooMock.VerifySet(s=> s.Bar = It.IsAny<IBar>(),Times.AtLeastOnce()); // Success
messenger.Send(new MyMessage());
fooMock.Verify(c => c.SomeMethod(), Times.Once); // Fails
VerifySet()
成功,传入正确的对象(通过调试检查),messenger 实例相同。但是Verify
方法调用失败了,我不太明白为什么。
我不太确定在 fooMock
上必须使用的设置方法(Setup?SetupSet?Another?)
删除您对
的通话
fooMock.SetupAllProperties();
这会导致 Mock 覆盖 属性,并且您的 Register 方法永远不会在 setter 中被调用。
上述行导致的代码永远不会是 运行(因为它被自定义实现覆盖)
public override IBar Bar
{
get { return _bar; }
set
{
_bar = value;
_bar?.Messenger.Register<MyMessage>(this, m => SomeMethod());
}
}
因此您永远不会在 Messenger 上订阅任何消息。
编辑
我的以下工作:
var messenger = new Messenger();
var bar = new Mock<Foo.IBar>();
bar.Setup(x => x.Messenger).Returns(messenger);
var fooMock = new Mock<Foo> { CallBase = true };
//fooMock.SetupAllProperties();
fooMock.Object.Bar = bar.Object;
fooMock.VerifySet(s => s.Bar = It.IsAny<Foo.IBar>(), Times.AtLeastOnce()); // Success
messenger.Send(new Foo.MyMessage());
fooMock.Verify(c => c.SomeMethod(), Times.Once); // Works
在发送消息以告知 Moq 注册调用之前,您可能需要做的一件事是:
fooMock.Setup(x => x.SomeMethod()).Verifiable();
我有一个派生的 class,它通过 属性 注入获取对象并在该对象的信使上注册:
public class Foo : AbsFoo
{
private IBar bar;
public override IBar Bar
{
get {return bar;}
set
{
bar = value
if(bar != null)
{
bar.Messenger.Register<MyMessage>(this, m => SomeMethod());
}
}
}
public override void SomeMethod()
{
//..
}
}
基本上,我想设置Bar
,发送消息,并验证是否调用了SomeMethod()
。
我的测试是这样的:
var fixture = new Fixture();
fixture.Customize(new AutoConfiguredMoqCustomization());
var messenger = new Messenger();
var barFixture = fixture.Create<IBar>();
barFixture.Messenger = messenger
var fooMock = new Mock<Foo> {CallBase = true};
fooMock.SetupAllProperties();
fooMock.Object.Bar = barFixture;
fooMock.VerifySet(s=> s.Bar = It.IsAny<IBar>(),Times.AtLeastOnce()); // Success
messenger.Send(new MyMessage());
fooMock.Verify(c => c.SomeMethod(), Times.Once); // Fails
VerifySet()
成功,传入正确的对象(通过调试检查),messenger 实例相同。但是Verify
方法调用失败了,我不太明白为什么。
我不太确定在 fooMock
删除您对
的通话 fooMock.SetupAllProperties();
这会导致 Mock 覆盖 属性,并且您的 Register 方法永远不会在 setter 中被调用。
上述行导致的代码永远不会是 运行(因为它被自定义实现覆盖)
public override IBar Bar
{
get { return _bar; }
set
{
_bar = value;
_bar?.Messenger.Register<MyMessage>(this, m => SomeMethod());
}
}
因此您永远不会在 Messenger 上订阅任何消息。
编辑
我的以下工作:
var messenger = new Messenger();
var bar = new Mock<Foo.IBar>();
bar.Setup(x => x.Messenger).Returns(messenger);
var fooMock = new Mock<Foo> { CallBase = true };
//fooMock.SetupAllProperties();
fooMock.Object.Bar = bar.Object;
fooMock.VerifySet(s => s.Bar = It.IsAny<Foo.IBar>(), Times.AtLeastOnce()); // Success
messenger.Send(new Foo.MyMessage());
fooMock.Verify(c => c.SomeMethod(), Times.Once); // Works
在发送消息以告知 Moq 注册调用之前,您可能需要做的一件事是:
fooMock.Setup(x => x.SomeMethod()).Verifiable();