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 将仅 代理 publicvirtual methods/properties。您应该替换接口或确保替换的 类 公开 public virtual 方法。据我所知,你的不是 virtual,虽然 NSubstitute 可以创建对象,但它不能有效地 proxy/mock 上面的任何东西。

此外,如果您的构造函数不是无参数的,请确保在 替换.

时为每个参数提供替换(或真实实例)

此处有更多详细信息:http://nsubstitute.github.io/help/creating-a-substitute/