C#moq如何正确设置接口以返回所需值

C#moq如何正确设置接口以返回所需值,c#,unit-testing,dependency-injection,moq,C#,Unit Testing,Dependency Injection,Moq,我为我的应用程序编写了各种测试,现在我遇到了一个无法解决的问题。 我正在编写的测试是一个简单的命令,它执行修改数据库的操作,然后是一个验证值是否正确的查询。 为了连接到数据库,my BaseContext从接口获取连接字符串: public-BaseContext(DbContextOptions选项,IConnectionStringProvider-connectionStringProvider-connectionprovider) :基本(选项) { _connectionString

我为我的应用程序编写了各种测试,现在我遇到了一个无法解决的问题。 我正在编写的测试是一个简单的命令,它执行修改数据库的操作,然后是一个验证值是否正确的查询。 为了连接到数据库,my BaseContext从接口获取连接字符串:

public-BaseContext(DbContextOptions选项,IConnectionStringProvider-connectionStringProvider-connectionprovider)
:基本(选项)
{
_connectionStringProvider=connectionStringProvider;
}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
如果(!optionBuilder.IsConfigured)
{
var connString=_connectionStringProvider.GetConnectionString();
optionsBuilder.UseOracle(connString);
}
}
我的连接字符串提供程序接口如下所示:

公共接口IConnectionStringProvider
{
字符串GetConnectionString();
字典GetConnectionSession();
}
实现如下所示:


公共类HttpConnectionStringProvider:IConnectionStringProvider
{
公共HttpConnectionStringProvider(IConfiguration配置,IHttpContextAccessor httpContextAccessor)
{
_配置=配置??抛出新的NullReferenceException(nameof(配置));
_httpContext=httpContextAccessor.httpContext??抛出新的NullReferenceException(“httpContext”);
}
公共字符串GetConnectionString()
{
//使用http上下文和配置文件执行操作,并返回连接字符串
}
}
所有这些接口都是使用autofac注册的

然后在执行以下测试时:


[测试]
公共异步任务AddProductTest()
{
字符串连接字符串=“固定连接字符串”;
var mock=新的MockRepository(MockBehavior.Default);
var mockConnectionStringProvider=new Mock();
mockConnectionStringProvider.Setup(x=>x.GetConnectionString())
.返回(连接字符串);
等待ProductModule.ExecuteCommandAsync(newAddProductCommand(1,“nameProduct”);
var products=await ProdcutModule.ExecuteQueryAsync(新的GetProducts(1));
//断言
Assert.That(products.Status,Is.EqualTo(ResultQueryStatus.Ok));
Assert.That(products.Value,Is.Not.Empty);
Assert.That(products.Value.Any(x=>x.Name==“nameProduct”);
}
使用NSSubstitute库模拟IConfiguration和IHttpContextAccessor。但是,即使我删除它们只是为了测试IConnectionStringProvider是否返回了安装程序中预期的值,它也无法工作


在debug中运行测试时,我看到在应该模拟方法GetConnectionString()时,它会进入该方法。我不知道我做错了什么,我想我对测试有些不了解。

我很好奇你想做什么:

模拟连接字符串以创建DB连接字符串或类似的连接字符串,这没有多大意义。它是设置中用于C#服务处理的DI位基本功能的一部分

如果你想搞砸这件事,当然你可以做,但我有点想不通

然而,如果您只是希望将ProductModule作为您所编写的东西进行测试,那么它就更有意义了

那么当你发表这一声明时:

ProductModule ProductModule=新ProductModule(-parameters-); 您的参数可能需要IConnectionStringProvider

在这里,您需要使用mockConnectionStringProvider.Object


这将允许您插入模拟对象,作为ProductModule构造函数中使用的对象。

您可以创建
mockConnectionStringProvider
。您实际在哪里使用它?在分派命令AddProduct时执行的命令处理程序使用ProductRepository,后者反过来使用BaseContext,后者使用ConnectionStringProvider。或者你的意思是我必须将mockConnectionStringProvider传递给使用它的实际对象?那么,如果使用依赖项注入进行注册,我该怎么做呢?在测试中,您应该模拟依赖项,并在实际依赖项上注册或注入模拟的依赖项,以便使用这些依赖项的类将引用模拟。您的设计应该遵循坚实的原则,这将允许您的代码是可测试和可扩展的。