是否可以编写一个单元测试来调用Messenger.Default.Register方法,然后编写一个断言供Action使用?
我想确定当我的ViewModel调用某个命令的Execute方法后是否发送了正确的消息。
我尝试将Assert.AreEqual编写为Action,但这似乎无法正常工作。
是否可以编写一个单元测试来调用Messenger.Default.Register方法,然后编写一个断言供Action使用?
我想确定当我的ViewModel调用某个命令的Execute方法后是否发送了正确的消息。
我尝试将Assert.AreEqual编写为Action,但这似乎无法正常工作。
public class YourViewModel
{
readonly IMessenger messenger;
public YourViewModel(IMessenger messenger)
{
this.messenger = messenger;
// setup of your delegate command to call Execute
}
void Execute(object parameter)
{
messenger.Send(new YourMessageType());
}
}
然后在你的单元测试中,你需要模拟 messenger 并验证正确的方法是否被调用,这个例子中是 Send
。因此,使用流行的模拟框架Moq:
public class YourViewModelTests
{
[Test]
public void Execute_Always_SendsYourMessageType()
{
// arrange
var mockRepository = new MockRepository(MockBehavior.Loose);
var mockMessenger = mockRepository.Create<IMessenger>();
var systemUnderTest = new YourViewModel(mockMessenger.Object);
// act
systemUnderTest.YourCommand.Execute(null);
// assert
mockMessenger.Verify(p => p.Send<YourMessageType>(
It.Is(m => /* return true if it's the right message */)));
}
}
public class YourViewModelTests
{
[Test]
public void Execute_Always_SendsYourMessageType()
{
// arrange
var systemUnderTest = new YourViewModel();
// Set the action to store the message that was sent
YourMessageType actual;
Messenger.Default.Register<YourMessageType>(this, t => actual = t);
// act
systemUnderTest.YourCommand.Execute(null);
// assert
YourMessageType expected = /* set up your expected message */;
Assert.That(actual, Is.EqualTo(expected));
}
}
另外,对于每个测试,可以创建一个单独的 Messenger 副本。对于运行时,您需要使用 Messenger 的默认实例,但对于单元测试,如我所说,为每个测试创建一个单独的副本:
return new GalaSoft.MvvmLight.Messaging.Messenger(); // Unit Tests
return GalaSoft.MvvmLight.Messaging.Messenger.Default; // Runtime