gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:11:49 24 4
gpt4 key购买 nike

我有兴趣使用“新 API”(从 ServiceStack.ServiceInterface.Service 继承)为使用 ServiceStack 创建的一些服务类编写单元测试(使用 NUnit)。在使用 AppHost 托管在 ASP.NET 应用程序中时,服务的 Db 属性已正确自动连接,但在该环境之外运行时,我似乎无法找出正确的技术。我在 ServiceStack 中看到了各种与测试相关的命名空间和类,但找不到一个明确的示例,其中服务的 Db 属性被注入(inject),而不是简单地直接设置连接工厂,然后调用各种 IDbConnection 扩展方法(插入、选择等)。

我尝试让我的测试类继承自 ServiceStack.ServiceInterface.Testing.TestBase 并覆盖其 Configure 方法来注册一个 IDbConnectionFactory(使用“:memory:”),以及设置 OrmLiteConfig.DialectProvider = SqliteDialect.Provider;在我的 TestFixtureSetUp 中,但是在调用我的服务方法时(在 ServiceStack.ServiceInterface.Service.get_Db() 处),我继续收到 NullReferenceException。 Funq 容器似乎没有自动连接任何东西。

SQLite 本身已正确设置,我可以通过绕过我的服务类并简单地执行直接 IDbConnection 调用的更简单的单元测试来确认这一点。

我错过了什么?

编辑

似乎对 ServiceStack 服务进行单元测试需要存在主机和客户端,尽管看起来有一些方法可以设置它以避免序列化成本(使用 DirectServiceClient,如图所示 here)——尽管我没有在我的情况下,它没有成功。我设法使用 AppHostHttpListenerBase 方法(请参阅 here )使其工作,尽管它更多的是集成测试而不是单元测试(因此速度较慢)。

最佳答案

docs on Testing展示了几种不同的注入(inject)依赖项的方法。

如果您查看基础 Service 的实现它只是创建 数据库 来自 IDbConnectionFactory :

private IDbConnection db;
public virtual IDbConnection Db
{
get { return db ?? (db = TryResolve<IDbConnectionFactory>().OpenDbConnection()); }
}

它只是从本地或全局 IResolver 解析国际奥委会容器:
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>();
}

因此,要注入(inject)您自己的依赖项(使用 Service 基类时),您只需要配置一个 IAppHost使用您的依赖项,您可以使用您的服务所需的内容:
using (var appHost = new BasicAppHost {
ConfigureContainer = c => {
c.Register<IDbConnectionFactory>(new ...);
}
}.Init())
{
//...
}

然后,您可以在您的服务上设置它以及您的服务需要的任何您自己的依赖项,例如:
var service = appHost.ResolveService<MyService>();

这将 Autowiring 您的 AppHost 中配置的所有依赖项,您还可以通过正常的属性访问添加自己的特定于测试的依赖项,例如:
var service.MyDependency = new Mock<IMyDependency>().Object;

从那时起,您可以照常调用和测试您的 C# 类方法:
var response = service.Get(new RequestDto { ... });
Assert.That(response.Result, Is.Equal("Expected Result from DB"));

关于nunit - 使用 NUnit 对 ServiceStack.OrmLite 进行单元测试时,如何将 Db 注入(inject)服务类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14244545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com