【问题标题】:Dependency Injection with Moq and AutoMoq (AutoFixture) w/ xUnit带 xUnit 的 Moq 和 AutoMoq (AutoFixture) 的依赖注入
【发布时间】:2019-09-03 14:13:19
【问题描述】:

我写这篇文章是因为我自己尝试了一段时间来解决这个问题,但没有运气。无论出于何种原因,我能找到的每个示例似乎都表明这是开箱即用的,但每当我尝试这样做时,我总是会出错。基本上,我有一个控制器,它有两个通过注入的属性。 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);
}

感谢阅读(:

【问题讨论】:

    标签: unit-testing .net-core xunit autofixture automoq


    【解决方案1】:

    尝试添加下一个属性并使用它来代替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);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-22
      • 1970-01-01
      • 2015-02-17
      • 2014-05-27
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2014-01-24
      相关资源
      最近更新 更多