测试剃刀页面应用程序

时间:2018-04-27 14:53:50

标签: asp.net testing razor .net-core razor-pages

我正在为大学项目编写一个Razor Pages应用程序,我需要对其进行测试。我在线测试Razor页面时找不到很多来源和示例,我试图按照此链接中的示例进行操作:https://docs.microsoft.com/en-us/aspnet/core/testing/razor-pages-testing?view=aspnetcore-2.1

我的第一个问题是单元测试:
这是我写的测试方法,它应该检查我的模型上的OnGet方法中填充的值是否正在接收正确的值:

[Fact]
    public void OnGet_ViewStores()
    {
        // Arrange
        var httpContext = new DefaultHttpContext();
        var modelState = new ModelStateDictionary();
        var actionContext = new ActionContext(httpContext, new RouteData(), new PageActionDescriptor(), modelState);
        var modelMetadataProvider = new EmptyModelMetadataProvider();
        var viewData = new ViewDataDictionary(modelMetadataProvider, modelState);
        var pageContext = new PageContext(actionContext)
        {
            ViewData = viewData
        };
        var storesModel = new StoresModel()
        {
            PageContext = pageContext,
            Url = new UrlHelper(actionContext)
        };

        #region snippet2
        // Act
        storesModel.OnGet();
        #endregion

        #region snippet3
        // Assert
        var actualStores = wsep1.Services.ViewAllStores(1);
        Assert.Equal(storesModel.StoreDetails, actualStores);
        #endregion
    }

这是正在检查的模型:

public class StoresModel : PageModel
{
    public List<string> StoreDetails { get; set; }
    public string Message { get; set; }
    public int clientId;

    public void OnGet()
    {
        clientId = (int)HttpContext.Session.GetInt32("clientId");
        Message = "Your clientId id is " + clientId;
        StoreDetails = wsep1.Services.ViewAllStores(clientId);
    }
}

问题是测试会抛出异常,因为我使用的HttpContext.Session在测试中没有正确配置。在我的真实项目中,它在此方法中预先在Startup.cs中配置:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddWebSocketManager();
        services.AddMvc();
        services.AddDistributedMemoryCache();
        services.AddTransient<ShoppingHandler>();
        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(1000);
            options.Cookie.HttpOnly = true;
        });
    }

但我似乎找不到在我的测试中配置它的方法。

我的第二个问题是集成测试:
我正在尝试使用Test Server运行一个非常基本的测试,这是我的测试类:

   public class IndexPageTest : IClassFixture<TestFixture<Client.Startup>>
{
    private readonly HttpClient _client;

    public IndexPageTest(TestFixture<Client.Startup> fixture)
    {
        _client = fixture.Client;
    }

    #region snippet1
    [Fact]
    public async Task Request_ReturnsSuccess()
    {
        // Act
        var response = await _client.GetAsync("/");

        // Assert
        response.EnsureSuccessStatusCode();
    }
    #endregion
}  

我几乎没有更改我在帖子开头给出的链接中包含在演示项目中的TextFixture类,我所做的就是将我的服务添加到配置方法中(正如我之前所说,我使用的是会话对象以及我的app中的WebSocketManager。) _client.GetAsync(“/”)返回状态“500 - 内部服务器错误”,我不知道为什么以及如何配置这些测试工作。
任何想法将不胜感激,谢谢。

0 个答案:

没有答案