簡體   English   中英

使用AutoNSubstituteData xUnit和AutoFixture在測試中創建控制器

[英]creating controller in a test using AutoNSubstituteData xUnit and AutoFixture

我不相信模式,但我正在嘗試創建這樣的測試:我想創建Controller,但是將依賴項作為Frozen參數提供給測試。

測試如下。

    [Theory, AutoNSubstituteData]
    public void TestService(
           [Frozen] ITestService service, 
           TestController controller, 
           string value)
    {
        controller.Test(value);
        service.Received().ProcessValue(Arg.Any<string>());
    }

測試開始時我收到此錯誤。

    System.InvalidOperationExceptionAn exception was thrown 
    while getting data for theory WebTest.Tests.Controllers.TestControllerRouteTests
    .TestService:
    System.Reflection.TargetInvocationException: 
    Exception has been thrown by the target of an invocation. ---> System.NotImplementedException:     The method or operation is not implemented.
       at System.Web.HttpContextBase.get_Items()
       at System.Web.WebPages.DisplayModeProvider.SetDisplayMode(HttpContextBase context, IDisplayMode displayMode)

我已經從這個AutoNSubsituteData帖子創建了AutoNSubstituteData屬性。 我試圖創建一個假上下文來解決問題。

/// <summary>
/// The auto n substitute data attribute.
/// </summary>
internal class AutoNSubstituteDataAttribute : AutoDataAttribute
{
    /// <summary>
    /// Initialises a new instance of the <see cref="AutoNSubstituteDataAttribute"/> class.
    /// </summary>
    internal AutoNSubstituteDataAttribute()
        : base(new Fixture()
        .Customize(new AutoNSubstituteCustomization())
        .Customize(new HttpContextBaseCustomization()))
    {
    }
}

internal class HttpContextBaseCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Customize<ViewContext>(_ => _.OmitAutoProperties());
        fixture.Customize<HttpContextBase>(_ => _.FromFactory(() => Substitute.For<HttpContextBase>()));
    }
}

這里的問題實際上是HttpContextBase.Items邪惡的 ,因為它是一個永遠拋出NotImplementedException虛擬屬性。

通常,模擬庫默認情況下不會覆蓋虛擬成員,我懷疑NSubstitute也是如此。 如果這是正確的,一個選項是配置Test Double以覆蓋Items屬性。

另一個選項是要求AutoFixture從Controller中省略HttpContext屬性,如果在測試用例中不需要它。

Mark Seemann鏈接的其中一個帖子中 ,我們發現以下代碼段為我們解決了這個問題 -

fixture.Customize<ControllerContext>(c => c
            .Without(x => x.DisplayMode));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM