代码之家  ›  专栏  ›  技术社区  ›  nportelli

这是测试MVVM Light工具包消息的可接受方法吗?

  •  2
  • nportelli  · 技术社区  · 14 年前
        [TestMethod()]
        public void ShowSetup_SendsMessage_WhenShowSetupCommandCalled()
        {
    
            //Arrange
            Messenger.Reset();
            MainViewModel target = new MainViewModel();
            bool wasCalled = false;
            Messenger.Default.Register<NotificationMessage>(this,"Settings",(msg) => wasCalled = true);
    
            //Act
            target.ShowSetupCommand.Execute(null);
    
            //Assert
            Assert.IsTrue(wasCalled);
        }
    

    我看到有一个i messenger接口,我试图模拟它并设置messenger.overridedefault到模拟如下:

    var mock = new Mock<IMessenger>();      
    Messenger.OverrideDefault((Messenger)mock.Object);
    

    但是我得到了一个无效的强制转换错误。overridedFault方法是否不适用于此目的,或者更可能是我使用错误。

    或者我会有一个用于接收消息和模拟消息的类的接口吗?我真正想测试的是,一个relaycommand在被调用时发送一条消息。

    2 回复  |  直到 9 年前
        1
  •  3
  •   ThunderEagle    14 年前

    我刚开始亲自看这个。我有点惊讶于messenger.overridedefault没有将i messenger作为参数。你必须继承信使。

    我想您可以创建一个内部使用模拟对象的类,然后进行验证。

            [Test]
        public void ShowSetup_SendsMessage_WhenShowSetupCommandCalled() {
            Messenger.Reset();
            MaintenanceViewModel target = new MainViewModel();
            IMessenger mockMessenger = MockRepository.GenerateMock<IMessenger>();
            mockMessenger.Expect(m => m.Send("Settings"));
            TestMessenger testMessenger = new TestMessenger(mockMessenger);
            Messenger.OverrideDefault(testMessenger);
            bool wasCalled = false;
            Messenger.Default.Register<NotificationMessage>(this, "Settings", (msg) => wasCalled = true);
            target.ShowSetupCommand.Execute(null);
    
            mockMessenger.VerifyAllExpectations();
        }
    

    您可能需要或可能不需要注册方法上的存根。

    testmessenger类:

        public class TestMessenger : Messenger {
        private IMessenger _mockMessenger;
        public TestMessenger(IMessenger mock) {
            _mockMessenger = mock;
        }
        public override void Register<TMessage>(object recipient, bool receiveDerivedMessagesToo, Action<TMessage> action) {
            _mockMessenger.Register<TMessage>(recipient, receiveDerivedMessagesToo, action);
        }
    
        public override void Register<TMessage>(object recipient, Action<TMessage> action) {
            _mockMessenger.Register<TMessage>(recipient, action);
        }
    
        public override void Send<TMessage, TTarget>(TMessage message) {
            _mockMessenger.Send<TMessage, TTarget>(message);
        }
    
        public override void Send<TMessage>(TMessage message) {
            _mockMessenger.Send<TMessage>(message);
        }
    
        public override void Unregister<TMessage>(object recipient, Action<TMessage> action) {
            _mockMessenger.Unregister<TMessage>(recipient, action);
        }
    
        public override void Unregister<TMessage>(object recipient) {
            _mockMessenger.Unregister<TMessage>(recipient);
        }
    
        public override void Unregister(object recipient) {
            _mockMessenger.Unregister(recipient);
        }
    }
    
        2
  •  0
  •   Community Reversed Engineer    7 年前

    使用构造器注入的另一种方法可以在这里看到 answer . 我认为最好使用构造函数注入,而不是使用static messenger.default。这是一种更健壮的方法,因为依赖项注入提供了自然的接缝,您可以在单元测试中轻松地用它替换依赖项。如果您试图替换静态成员调用,那么您依赖于明显可以更改的内部实现。