nsubstitute 在创建替代时给出异常
nsubstitute giving exception while creating substitute
我们正在尝试将 Nunit 测试集成到我们的 Web 应用程序中。这里我们使用 Nsubstitute 作为模拟框架。
项目架构如下:
Public class BaseService : Glass.Mapper.Sc.SitecoreContext
{
public BaseService(){}
}
Public class DerivedService : BaseService
{
IGenericRepository<Item> _genericRepository;
public DerivedService ( IGenericRepository<Item> _repository)
{
_genericRepository= _repository;
}
public string DoSomethig(){}
}
现在要测试我的 DerivedService class 的 DoSomething() 方法,我正在创建我的存储库的替代品并伪造其响应。这应该让我测试我的服务代码。
[Test]
public void TestDoSomethigMethod()
{
var repository = Substitute.For<IGenericRepository<Item>>();
DerivedService tempService = new DerivedService(repository);
// Throws an exception of type System.Collections.Generic.KeyNotFoundException : The given key was not present in the dictionary. at base service constructor.
var response = tempService.DoSomething();
}
当我尝试调用派生服务的实例时,它在 baseService 构造函数处抛出异常说(字典中不存在给定的键)
我们正在使用温莎城堡进行依赖注入,Base Class 继承自 Glass Mapper 站点核心上下文 class。
如果有人遇到任何此类问题或对此有解决方案,请告诉我。
编辑:根据 Pavel 和 Marcio 的建议更新了测试用例的代码。
您不应该为 DerivedService
创建替代品,而是为 IGenericRepository<Item>
创建替代品并将其注入 DerivedService
。
您只会为要模拟的部分创建替代品,而不是要测试的部分。
这是你应该做的:
[Test]
public void TestDoSomethigMethod()
{
var repository = Substitute.For<IGenericRepository<Item>>();
// Here you set up repository expectations
DerivedService tempService = new DerivedService(repository);
var response = tempService.DoSomething();
// Here you assert the response
}
NSubstitute
将仅 代理 public
和 virtual
methods/properties。您应该替换接口或确保替换的 类 公开 public virtual
方法。据我所知,你的不是 virtual
,虽然 NSubstitute
可以创建对象,但它不能有效地 proxy/mock 上面的任何东西。
此外,如果您的构造函数不是无参数的,请确保在 替换.
时为每个参数提供替换(或真实实例)
此处有更多详细信息:http://nsubstitute.github.io/help/creating-a-substitute/
我们正在尝试将 Nunit 测试集成到我们的 Web 应用程序中。这里我们使用 Nsubstitute 作为模拟框架。 项目架构如下:
Public class BaseService : Glass.Mapper.Sc.SitecoreContext
{
public BaseService(){}
}
Public class DerivedService : BaseService
{
IGenericRepository<Item> _genericRepository;
public DerivedService ( IGenericRepository<Item> _repository)
{
_genericRepository= _repository;
}
public string DoSomethig(){}
}
现在要测试我的 DerivedService class 的 DoSomething() 方法,我正在创建我的存储库的替代品并伪造其响应。这应该让我测试我的服务代码。
[Test]
public void TestDoSomethigMethod()
{
var repository = Substitute.For<IGenericRepository<Item>>();
DerivedService tempService = new DerivedService(repository);
// Throws an exception of type System.Collections.Generic.KeyNotFoundException : The given key was not present in the dictionary. at base service constructor.
var response = tempService.DoSomething();
}
当我尝试调用派生服务的实例时,它在 baseService 构造函数处抛出异常说(字典中不存在给定的键) 我们正在使用温莎城堡进行依赖注入,Base Class 继承自 Glass Mapper 站点核心上下文 class。 如果有人遇到任何此类问题或对此有解决方案,请告诉我。
编辑:根据 Pavel 和 Marcio 的建议更新了测试用例的代码。
您不应该为 DerivedService
创建替代品,而是为 IGenericRepository<Item>
创建替代品并将其注入 DerivedService
。
您只会为要模拟的部分创建替代品,而不是要测试的部分。
这是你应该做的:
[Test]
public void TestDoSomethigMethod()
{
var repository = Substitute.For<IGenericRepository<Item>>();
// Here you set up repository expectations
DerivedService tempService = new DerivedService(repository);
var response = tempService.DoSomething();
// Here you assert the response
}
NSubstitute
将仅 代理 public
和 virtual
methods/properties。您应该替换接口或确保替换的 类 公开 public virtual
方法。据我所知,你的不是 virtual
,虽然 NSubstitute
可以创建对象,但它不能有效地 proxy/mock 上面的任何东西。
此外,如果您的构造函数不是无参数的,请确保在 替换.
时为每个参数提供替换(或真实实例)此处有更多详细信息:http://nsubstitute.github.io/help/creating-a-substitute/