vendredi 27 avril 2018

Testing razor pages app

I am writing a Razor Pages app for a University project, which I am required to test. I couldn't find many sources and examples online on testing Razor Pages and I'm trying to follow the examples on this link : https://docs.microsoft.com/en-us/aspnet/core/testing/razor-pages-testing?view=aspnetcore-2.1

My first problem is unit testing:
This is the test method I wrote, it's supposed to check that a value that is filled in the OnGet method on my model is receiving the correct value:

[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
    }

And this is the model which is being checked:

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);
    }
}

The problem is that the test throws an exception because I am using an HttpContext.Session which is not configures properly in the test. In my real project it is configured beforehand in Startup.cs in this method:

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;
        });
    }

But I can't seem to find a way to configure this in my test.

My second problem is with integration testing:
I am trying to run a very basic test with the Test Server, this is my test class:

   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
}  

I hardly changed the TextFixture class that was included in the demo project in the link I gave at the beginning of the post, all I did was add my services to the configuration method (as I said before, I'm using a Session object and also WebSocketManager in my app).
_client.GetAsync("/") returns a status of "500 - internal server error" and I have no idea why and how to configure these tests to work.
Any ideas would be appreciated, Thanks.

Aucun commentaire:

Enregistrer un commentaire