ormlite-servicestack,Nunit,Inversion Of Control,ormlite Servicestack" /> ormlite-servicestack,Nunit,Inversion Of Control,ormlite Servicestack" />

使用NUnit对ServiceStack.OrmLite进行单元测试时,如何将Db注入服务类?

使用NUnit对ServiceStack.OrmLite进行单元测试时,如何将Db注入服务类?,nunit,inversion-of-control,ormlite-servicestack,Nunit,Inversion Of Control,ormlite Servicestack,我对使用NUnit为使用ServiceStack创建的一些服务类编写单元测试感兴趣,这些服务类使用继承自ServiceStack.ServiceInterface.service的新API。当使用AppHost托管在ASP.NET应用程序中时,服务的Db属性是正确自动连接的,但在该环境之外运行时,我似乎无法找到正确的技术。我在ServiceStack中看到了各种与测试相关的名称空间和类,但找不到一个明确的例子来说明服务的Db属性是如何被注入的,而不是简单地直接设置一个连接工厂,然后调用各种IDb

我对使用NUnit为使用ServiceStack创建的一些服务类编写单元测试感兴趣,这些服务类使用继承自ServiceStack.ServiceInterface.service的新API。当使用AppHost托管在ASP.NET应用程序中时,服务的Db属性是正确自动连接的,但在该环境之外运行时,我似乎无法找到正确的技术。我在ServiceStack中看到了各种与测试相关的名称空间和类,但找不到一个明确的例子来说明服务的Db属性是如何被注入的,而不是简单地直接设置一个连接工厂,然后调用各种IDbConnection扩展方法Insert、Select等

我已尝试让我的测试类从ServiceStack.ServiceInterface.Testing.TestBase继承,并重写其配置方法以使用:memory:,注册IDbConnectionFactory,以及设置OrmLiteConfig.DialogProvider=SQLiteDialogue.Provider;在我的TestFixtureSetUp中,但在ServiceStack.ServiceInterface.service.get_Db处调用我的服务方法时,我继续得到一个NullReferenceException。Funq容器似乎没有自动布线功能

SQLite本身是正确设置的,我可以通过更简单的单元测试来确认这一点,这些单元测试绕过我的服务类,只进行直接IDbConnection调用

我错过了什么

编辑

单元测试ServiceStack服务似乎需要主机和客户端的存在,尽管看起来有一些方法可以设置它以避免使用DirectServiceClient的序列化成本,如图所示-尽管在我的案例中,我还没有成功地实现这一点。我使用AppHostHttpListenerBase方法成功地实现了这一点,尽管它更像是一个集成测试,而不是单元测试,因此速度较慢。

显示了几种注入依赖项的不同方法

如果您查看基础的实现,它只是从IDbConnectionFactory创建Db:

因此,要在使用服务基类时注入您自己的依赖项,您只需使用您的服务所需的依赖项配置IAppHost即可:

using (var appHost = new BasicAppHost {
    ConfigureContainer = c => {
        c.Register<IDbConnectionFactory>(new ...);
    }
}.Init())
{
  //...    
}

这工作做得很好!谢谢我必须将我的一个ExpectedException从包装器WebServiceException转换回内部的一个HttpError,但是考虑到我不再使用服务客户机,这是有意义的。
public static IResolver GlobalResolver { get; set; }

private IResolver resolver;
public virtual IResolver GetResolver()
{
    return resolver ?? GlobalResolver;
}

public virtual T TryResolve<T>()
{
    return this.GetResolver() == null
        ? default(T)
        : this.GetResolver().TryResolve<T>();
}
using (var appHost = new BasicAppHost {
    ConfigureContainer = c => {
        c.Register<IDbConnectionFactory>(new ...);
    }
}.Init())
{
  //...    
}
var service = appHost.ResolveService<MyService>();
var service.MyDependency = new Mock<IMyDependency>().Object;
var response = service.Get(new RequestDto { ... });
Assert.That(response.Result, Is.Equal("Expected Result from DB"));