繁体   English   中英

带有 xUnit 的 Moq 和 AutoMoq (AutoFixture) 的依赖注入

[英]Dependency Injection with Moq and AutoMoq (AutoFixture) w/ xUnit

我写这篇文章是因为我已经尝试了一点自己解决这个问题但没有运气。 无论出于何种原因,我能找到的每个示例似乎都表明这只是开箱即用,但每当我尝试这样做时,我总是会出错。 基本上,我有一个控制器,它有两个通过注入的属性。 DI,比方说

public class SomeController
{
    private ISomeInterface _i;
    private MyConfig _c;

    public SomeController(ISomeInterface i, MyConfigContext cxt) // Where cxt is Type of DbContext
    {
        _i = i;
        _c = cxt.Configs.FirstOrDefault();
    }

    public OkResult PostModel(SomeModel c)
    {
        // Do things
        return Ok();
    }
}

在我使用 xUnit、Moq 和 AutoFixture 的测试中,我试图避免必须手动实例化依赖项BC

public class SomeControllerTests
{
    private MyDbContext _cxt;
    private Fixture _fixture;

    public SomeControllerTests()
    {
        _cxt = GetCxt() // GetCxt() just returns a context instance, nothing special
       _fixture = new Fixture();
       _fixture.Customize(new AutoMoqCustomization { ConfigureMembers = true });
       _fixture.Customizations.Add(
          new TypeRelay(
              typeof(ISomeInterface),
              typeof(SomeConcreteClass)
          )
       );
    }

    [Fact, AutoData]
    public void PostStatus_ReturnsOk_GivenValidRequest()
    {
        SomeController c = _fixture.Create<SomeController>();
        SomeModel m = _fixture.Create<SomeModel>();
        var result = c.PostModel(m);

        Asset.IsType<OkResult>(result);
    }
}  

有了上面的内容,我在运行测试时得到了一个NotImplementedException ,它不会告诉我到底是什么没有被实现,所以我无法知道问题是什么。 我一定是在文档中遗漏了一些东西。 我想使用 AutoFixture 使我的测试更持久,但到目前为止,尝试使用它一直很痛苦。 我真的不想为了运行测试而手动模拟/存根我的整个应用程序。 理想情况下,我想使用 AutoFixture 文档中显示的语法,您将与测试相关的实例放在测试的参数中,它们是为您创建的,但我没有任何运气,比如......

[Theory, AutoData]
SomeTestMethod(SomeController c, SomeModel m)
{
    var result = c.PostModel(m);

    Assert.IsType<OkResult>(result);
}

谢谢阅读 (:

尝试添加下一个属性并使用它代替AutoData

using AutoFixture.AutoMoq;
using AutoFixture.Xunit2;

namespace Cats
{
    public class AutoMoqDataAttribute : AutoDataAttribute
    {
        public AutoMoqDataAttribute()
            : base(() => new Fixture().Customize(new AutoMoqCustomization()))
        {
        }
    }
}

[Theory, AutoMoqData]
SomeTestMethod(SomeController c, SomeModel m)
{
    var result = c.PostModel(m);

    Assert.IsType<OkResult>(result);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM