Как написать тестовый модуль на стороне сервера, использующий HttpContext? - PullRequest
0 голосов
/ 09 октября 2018

Я новичок в написании веб-приложений.

Я хочу протестировать код, который создает коллекцию

Вот пока что модульный тест.

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        var accessor = new HttpContextAccessor {HttpContext = new DefaultHttpContext()};
        var helper = new NodeHelper(accessor);
        var nodes = helper.GetNodes();
        Assert.IsTrue(nodes.Count > 0);
        // var nodes = NodeHelper
    }
}

Сбой из-за ошибки

System.InvalidOperationException: сеанс не был настроен для этого приложения или запроса.в Microsoft.AspNetCore.Http.DefaultHttpContext.get_Session ()

1 Ответ

0 голосов
/ 09 октября 2018

Используя примеры из DefaultHttpContextTests.cs на Github, кажется, что вам нужно настроить некоторые вспомогательные классы, чтобы HttpContext имел пригодный для использования сеанс для теста.

private class TestSession : ISession
{
    private Dictionary<string, byte[]> _store
        = new Dictionary<string, byte[]>(StringComparer.OrdinalIgnoreCase);

    public string Id { get; set; }

    public bool IsAvailable { get; } = true;

    public IEnumerable<string> Keys { get { return _store.Keys; } }

    public void Clear()
    {
        _store.Clear();
    }

    public Task CommitAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(0);
    }

    public Task LoadAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(0);
    }

    public void Remove(string key)
    {
        _store.Remove(key);
    }

    public void Set(string key, byte[] value)
    {
        _store[key] = value;
    }

    public bool TryGetValue(string key, out byte[] value)
    {
        return _store.TryGetValue(key, out value);
    }
}

private class BlahSessionFeature : ISessionFeature
{
    public ISession Session { get; set; }
}

Вы могли также смоделировать контекст, сессию и другие зависимости, но этот способ требовал меньше настройки, чем необходимость настройки большого количества макетов.

При этом тест можно организовать соответствующим образом

[TestClass]
public class NodeHelperTests{
    [TestMethod]
    public void Should_GetNodes_With_Count_GreaterThanZero() {
        //Arrange
        var context = new DefaultHttpContext();
        var session = new TestSession();
        var feature = new BlahSessionFeature();
        feature.Session = session;
        context.Features.Set<ISessionFeature>(feature);
        var accessor = new HttpContextAccessor { HttpContext = context };
        var helper = new NodeHelper(accessor);

        //Act
        var nodes = helper.GetNodes();

        //Assert
        Assert.IsTrue(nodes.Count > 0);            
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...