Mvx.Resolve 在单元测试中失败

Rob*_*Rob 0 nunit unit-testing mocking mvvmcross xamarin

我目前正在尝试为使用 mvvmcross 以 xamaring 编写的 android/ios 应用程序编写单元测试。我已经按照wiki 中的说明进行操作,当服务尝试以这种方式更改 ViewModel 时,它们确实运行良好:

var viewDispatcher = Mvx.Resolve<IMvxViewDispatcher>();
viewDispatcher?.ShowViewModel(
new MvxViewModelRequest(typeof(HomeViewModel), null, null, MvxRequestedBy.Unknown));
Run Code Online (Sandbox Code Playgroud)

测试在第一行失败Mvx.Resolve();。我认为这归结为在模拟 IoC 容器中注册接口:

this.mockDispatcher = new MockDispatcher();
this.Ioc.RegisterSingleton<IMvxViewDispatcher>(this.mockDispatcher);
this.Ioc.RegisterSingleton<IMvxMainThreadDispatcher(this.mockDispatcher);
Run Code Online (Sandbox Code Playgroud)

所以当以这种方式调用时,Mvx 无法解析。可以测试此代码还是有任何其他可能性可以从服务中更改 ViewModel?

Sve*_*übe 6

我想你AdditionalSetup永远不会接到电话。如果使用 nunit,则必须将该SetUp属性添加到设置方法并调用Setup()of MvxIoCSupportingTest,否则调用相应的属性。

public abstract class MvxTestBase : MvxIoCSupportingTest
{
    protected MockDispatcher mockDispatcher;

    protected override void AdditionalSetup()
    {
        this.mockDispatcher = new MockDispatcher();
        this.Ioc.RegisterSingleton<IMvxViewDispatcher>(this.mockDispatcher);
        this.Ioc.RegisterSingleton<IMvxMainThreadDispatcher>(this.mockDispatcher);
    }

    [SetUp]
    public virtual void SetupTest()
    {
        Setup();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您在每个测试中调用它,如下所示:https : //mvvmcross.com/docs/testing#section-test-class-declaration-and-setup