2


我正在使用 MvvmCross v3 和 Xamarin 解决方案创建一个跨平台项目,并且我想创建一些单元测试。 似乎有点过时了,所以我试图遵循这个并且它按预期工作。

但是,我现在正在尝试对我的一些域服务进行单元测试,这些服务依赖于特定于平台的 MvvvCross 插件(例如ResourceLoader)。

在以下异常中运行测试结果:

Cirrious.CrossCore.Exceptions.MvxException: Failed to resolve type   
Cirrious.CrossCore.Plugins.IMvxPluginManager.

我假设这IMvxPluginManager可能已在设置流程中注册,并且我需要在我的项目中包含插件的平台实现,但我想知道设置我的单元测试项目的首选方式是什么?有什么我想念的吗?

是否有上述任务的更新教程?

是否已经有任何支持测试环境的插件平台扩展,或者我应该尝试自己编写它们?

4

2 回答 2

5

通常,您不应该MvxPluginManager在服务测试期间加载插件或真实的。

相反,您的单元测试应该为您的服务需要使用的接口注册模拟类型。

var mock = new Mock<INeedToUse>();
// use mock.Setup methods
Ioc.RegisterSingleton<INeedToUse>(mock.Object);
// or you can use constructor dependency injection on INeedToUse instead

如果你真的需要,你也可以注册一个模拟IMvxPluginManager,但在大多数情况下,我认为你不应该需要它。如果您有绝对需要它的案例,请发布代码示例 - 用代码说话比用文字说话更容易。

于 2013-04-28T09:28:50.857 回答
3

这种情况应该很有可能。我想对我的 SqlLite 服务实现进行单元测试。我做了以下工作来让它工作:

  • 创建 Visual Studio 单元测试项目
  • 添加对 .Core 可移植库项目的引用
  • 添加对 MvvmCross 测试助手的 nuget 引用
  • 添加对 MvvmCross SqlLite 插件的块引用(这将利用 SqlLite 的 WPF 实现)

下载 SqlLite windows 库并将它们复制到您的测试项目 Sql Lite 下载位置 并确保将 sqllite3.dll 添加到单元测试项目的根目录并将“复制到输出库”设置为“始终复制”。这将确保将实际的 sqllite 数据库复制到单元测试 dll 位置。(检查 DLL 是否已复制到您的 bin/debug 文件夹)

然后按以下方式编写单元测试:

[TestClass]
public class SqlServiceTests:MvxIoCSupportingTest
{
    private readonly ISQLiteConnectionFactory _factory;

    public SqlServiceTests()
    {
        base.ClearAll();

        _factory = new MvxWpfSqLiteConnectionFactory();
        Ioc.RegisterSingleton<ISQLiteConnectionFactory>(_factory);
    }
    [TestMethod]
    public void YourSqlLiteTest()
    {
        // Arrange
        var si = new SqlDataService(_factory);
        var list = si.GetOrderList();
    }
}

我没有用我的视图模型测试过这个。通过使用 IoC.RegisterSingleton 方法,SqlConnectionFactory 应该可用于您的视图模型。

于 2013-11-04T23:17:48.533 回答