在单元测试类中使用依赖注入

时间:2017-08-17 20:23:58

标签: c# dependency-injection xunit

我正在使用xunit为我的web api编写单元测试。我的web api使用依赖注入使用构造函数注入将DbContext和IConfiguration作为参数传递。我希望能够在我的单元测试项目中执行此操作,以便我可以轻松访问DbContext和IConfiguration。我已经阅读过使用夹具来做到这一点,但我还没有找到一个很好的例子来说明如何处理它。我看过使用TestServer类的文章,但我的项目的目标是.NETCoreApp1.1框架,它不允许我使用TestServer类。这里有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您确定需要在测试中使用这些依赖项吗? 根据单元测试理念,考虑使用一些模拟框架来提供具有合适行为和值的DbContext和IConfiguration的虚拟实例。 尝试研究NSubstitute或Moq框架。

答案 1 :(得分:2)

我发现创造假冒伪劣产品的最简单方法。传递给需要IConfiguration实例的方法的配置如下:

[TestFixture]
public class TokenServiceTests
{
    private readonly IConfiguration _configuration;

    public TokenServiceTests()
    {
        var settings = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("JWT:Issuer", "TestIssuer"),
            new KeyValuePair<string, string>("JWT:Audience", "TestAudience"),
            new KeyValuePair<string, string>("JWT:SecurityKey", "TestSecurityKey")
        };
        var builder = new ConfigurationBuilder().AddInMemoryCollection(settings);
        this._configuration = builder.Build();
    }

    [Test(Description = "Tests that when [GenerateToken] is called with a null Token Service, an ArgumentNullException is thrown")]
    public void When_GenerateToken_With_Null_TokenService_Should_Throw_ArgumentNullException()
    {
        var service = new TokenService(_configuration);
        Assert.Throws<ArgumentNullException>(() => service.GenerateToken(null, new List<Claim>()));
    }
}

[这显然使用NUnit作为测试框架]