其他分享
首页 > 其他分享> > 我如何测试已收到MVVM指示灯消息并采取措施?

我如何测试已收到MVVM指示灯消息并采取措施?

作者:互联网

我有一个派生类,它通过属性注入获取对象并在该对象的Messenger上注册:

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实例相同.但是Verifyon方法调用失败,我真的不明白为什么.

我不太确定我必须在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();

标签:autofixture,unit-testing,moq,mvvm-light,c
来源: https://codeday.me/bug/20191026/1938315.html