Как издеваться над HttpSessionStateBase с помощью NSubstitute

В Moq я могу настроить переменную сеанса следующим образом (код vb.NET):

Dim httpContext As Mock(Of HttpContextBase) = New Mock(Of HttpContextBase)()
Dim httpRequest As Mock(Of HttpRequestBase) = New Mock(Of HttpRequestBase)()
Dim httpResponse As Mock(Of HttpResponseBase) = New Mock(Of HttpResponseBase)()
Dim httpSession As Mock(Of HttpSessionStateBase) = New Mock(Of HttpSessionStateBase)()
**httpSession.Setup(Function(s) s("RoleId")).Returns(1008)**
...

Как я могу сделать это с помощью NSubstitute?

Я пробовал это, но не работал:

HttpSession.Item("RoleId").Returns(1008) 'but got the error NullReferenceExpection.

httpContext.Session("RoleId").Returns(1008) 'but got the same error

Обновление: попробовал пример Nkosi C #, он сработал. Однако при преобразовании его в vb.NET следующим образом:

<Fact>
Public Sub Session_Should_Have_Item()
Dim httpContext = Substitute.[For](Of HttpContextBase)()
Dim expected = 1008
httpContext.Session("RoleId").Returns(expected)
Dim actual = httpContext.Session("RoleId")
actual.Should().Be(expected)
End Sub

ошибка времени выполнения возникает в строке, как я упоминал ранее:

enter code here`httpContext.Session("RoleId").Returns(expected)

Мне кажется, что NSubstitute не очень хорошо поддерживает vb.net - у него проблемы с разбором скобок. Кто-нибудь может подтвердить, что это проблема?


person user1944127    schedule 17.08.2018    source источник
comment
сообщение об ошибке: Исключение типа «System.NullReferenceException» произошло в Microsoft.VisualBasic.dll, но не было обработано в пользовательском коде. Дополнительная информация: переменная объекта или переменная блока не установлена.   -  person user1944127    schedule 18.08.2018


Ответы (1)


Попробуйте следующее

Dim httpContext As HttpContextBase = Substitute.For(Of HttpContextBase)()
Dim httpSession As HttpSessionStateBase = Substitute.For(Of HttpSessionStateBase)()

httpSession("RoleId").Returns(1008)

httpContext.Session.Returns(httpSession)

Что ссылается на примеры из документации.

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

Хотя в С# следующее работает при использовании NSubstitute с рекурсивными макетами

[Fact]
public void Session_Should_Have_Item() {
    //Arrange
    var httpContext = Substitute.For<HttpContextBase>();
    var expected = 1008;
    httpContext.Session["RoleId"].Returns(expected);

    //Act
    var actual = httpContext.Session["RoleId"];

    //Assert
    actual.Should().Be(expected);
}
person Nkosi    schedule 17.08.2018
comment
Я попробовал оператор httpSession(RoleId).Returns(1008), но получил ту же ошибку, о которой упоминал ранее. Изучите ссылку, которую вы предоставили, и попробуйте примеры там. - person user1944127; 18.08.2018
comment
Я попробовал ваш код С#, и он работает. Однако, когда я преобразовал его в код vb.net следующим образом: ‹Fact› ​​Public Sub Session_Should_Have_Item() Dim httpContext = Substitute.[For](Of HttpContextBase)() Dim ожидаемый = 1008 httpContext.Session(RoleId).Returns(expected) Dim fact = httpContext.Session(RoleId) fact.Should().Be(expected) End Sub ошибка переходит в строку: httpContext.Session(RoleId).Returns(expected) - person user1944127; 20.08.2018