簡體   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