У меня есть модульный тест для имитации My.User.IsInRole()
, используемого в следующем контроллере,
Public Class BookingController
Public Function GetUserRole() As String
If My.User.IsInRole("Agent") Then
result = "Login as Agent"
End If
```
End Function
End Class
пытаюсь настроить макет в этом тестовом примере (код VB):
<TestMethod()>
Public Sub Test()
//Arrange
'Dim httpContext = New Mock(Of System.Web.HttpContextBase)()
Dim principal = New Moq.Mock(Of IPrincipal)()
'httpContext.Setup(Function(x) x.User).Returns(principal.[Object])
principal.Setup(Function(p) p.IsInRole("Agent")).Returns(True)
Thread.CurrentPrincipal = principal.[Object]
// Act
Dim result = controller.GetUserRole()
End Sub
При вызове GetUserRole()
My.User.IsInRole("Agent")
должен возвращать True
, но возвращает False
. Что-то не так с моим кодом?
Любые предложения об этой ошибке.
Вы также должны ссылаться на Быстрый запуск Moq, чтобы лучше понять, как использовать фреймворк mocking.
@Nkosi Спасибо. Я попытался использовать It.IsAny (..), указанный в Moq Quickstart, но получил ошибку исключения: screencast.com/t/NT6Hzy6snmN
перечитайте сообщение об ошибке. У вас есть Sub, когда для обратного вызова в Returns
требуется функция, поскольку ожидается, что она вернет значение
да, я понял, что нужно изменить функцию, но у меня возникла ошибка исключения: screencast.com/t/53fAt7sa
Исходный код работает, если назначить макет принципа принципу текущего потока.
Хорошо, рад, что у вас все получилось
Я просто задаю еще один вопрос, чтобы высмеять два основных объекта, интересно, могу ли я иметь ваше представление об этом. Спасибо.
Вам нужно присвоить макет принципа принципу текущего потока (ниже приведен код C#, я надеюсь, вы сможете его интерпретировать)
// Make fack principle instance
var fackPrinciple = new Mock<IPrinciple>();
// Setup fack data
fackPrinciple.Setup(e => e.IsInRole(It.IsAny<String>)).Returns(true);
// Assign to current thread principle
Thread.CurrentPrincipal = fackPrinciple.Object;
Пожалуйста, дайте мне знать, если возникнут проблемы?
Отлично, он отлично работает, назначая mock принципу текущего потока. Большое спасибо @programtreasures.
Я только что создал еще один вопрос, чтобы имитировать два основных объекта. Он работает, если я имитирую отдельный объект, но не работает для насмешек по обоим принципам, потому что текущий принцип может быть назначен только одному фиктивному объекту. Интересно, есть ли у вас представление об этом. Спасибо.
@Julia Я понятия не имею, почему вы хотите издеваться над двумя основными объектами, но вы не можете этого сделать.
Я высмеиваю два принципа, потому что он работает с разными принципами, и теперь я пытаюсь использовать один принцип для обеих функций-членов, но это не работает.
Попробуйте настроить его с помощью
p.IsInRole(It.IsAny(Of String)())
и посмотрите, имеет ли это значение. может быть проблема с сравниваемым текстом кодировки.