2013-04-28 63 views
2


我正在用MvvmCross v3和Xamarin解决方案创建一个跨平台项目,我想创建一些单元测试。 This似乎有点过时,所以我试图按照this,它按预期工作。MvvmCross:带插件的单元测试服务

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

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

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

我认为IMvxPluginManager在安装流程大概注册,和我需要包括平台实现我的项目中的插件,但我想知道设置我的单元测试项目的首选方式是什么?有什么我失踪了吗?

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

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

回答

4

通常,在服务测试期间,您不应该加载插件或真正的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,如果你真的需要,但在大多数情况下,我不相信你应该需要这一点。如果您有绝对需要的情况,请发布代码示例 - 使用代码而不是文本交谈更容易。

+0

嗨,斯图亚特,谢谢,我会试图制造嘲笑。是不是创建一个模拟,让我们说IMvxPluginManager,实际上是相同的实施单元测试项目的“插件”?假设我的测试服务实际上应该正在加载资源文件... – Liel 2013-04-29 03:40:10

+0

没有看到您的服务我不确定 - 但通常我个人更喜欢只是在我的测试中从c#提供一个字符串,而不是添加资源文件并依靠一个测试插件。如果你确实想写一个模拟插件,你可以 - 也许我'你不应该'的回答是措辞强烈 - 也许更像'我不会' – Stuart 2013-04-29 06:31:31

+0

如果你真的想测试真正的插件呢?可能吗? – tofutim 2013-12-14 17:40:32

3

这种情况应该是可能的。我想UnitTest我的SqlLite服务实现。我做了以下才能正常工作:

  • 创建一个Visual Studio单元测试项目
  • 添加一个参考。核心移植库项目
  • 添加的NuGet参考MvvmCross测试助手
  • 添加金块参考MvvmCross SqlLite插件 (这会利用WPF实现SqlLite的)

下载SqlLite窗口库,这些拷贝到您的检验p项目 Sql Lite Download location 并确保将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应该可用于您的视图模型。

+0

辉煌,谢谢。我是那些没有进行“正确方式”单元测试的人之一,但它对我很有用。具体来说,我喜欢在“:memory:”模式下使用SQLite来针对实际数据运行测试(在测试运行时加载)。当我试图指定“:memory:”作为db名称时,它抱怨说它无法在C:\ Users \上创建数据库... – 2014-01-07 14:18:28