c# - 我该如何设置(最小起订量设置)

标签 c# unit-testing mocking moq

我想测试返回用户密码问题的代码部分。因此,我使用 Moq 制作了成员(member)提供程序的模型。

我认为我不需要向您展示实际代码,只需要展示它的测试部分。

// Arrange
var membershipMock = new Mock<MembershipProvider>();
membershipMock.Setup(m => m.GetUser("test", false).PasswordQuestion).Returns("Password");
authentication.Authenticate.Provider = membershipMock.Object;

// Act
var actual = authentication.PasswordRecoveryStep1(It.IsAny<string>());

// Assert
Assert.That(actual, Is.EqualTo("Password"));

所以当我在 Nunit 中运行它时,我得到了这个:

Test.Controllers.AuthenticationControllerTest.Test_If_Password_Recovery_Setp1_Returns_Users_PasswordQuestion:
System.NotSupportedException : Only property accesses are supported in intermediate invocations on a setup. Unsupported expression m.GetUser("test", False).

at Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall(MethodCallExpression m)
at Moq.ExpressionVisitor.Visit(Expression exp)
at Moq.Mock.AutoMockPropertiesVisitor.VisitMemberAccess(MemberExpression m)
at Moq.ExpressionVisitor.Visit(Expression exp)
at Moq.Mock.AutoMockPropertiesVisitor.SetupMocks(Expression expression)
at Moq.Mock.GetInterceptor(LambdaExpression lambda, Mock mock)
at Moq.Mock.<>c__DisplayClass15`2.<SetupGet>b__14()
at Moq.PexProtector.Invoke[T](Func`1 function)
at Moq.Mock.SetupGet[T1,TProperty](Mock mock, Expression`1 expression)
at Moq.Mock.<>c__DisplayClass12`2.<Setup>b__11()
at Moq.PexProtector.Invoke[T](Func`1 function)
at Moq.Mock.Setup[T1,TResult](Mock mock, Expression`1 expression)
at Moq.Mock`1.Setup[TResult](Expression`1 expression)
at Test.Controllers.AuthenticationControllerTest.Test_If_Password_Recovery_Setp1_Returns_Users_PasswordQuestion() in D:\MvcApplication9\Test\Controllers\AuthenticationControllerTest.cs:line 186

所以我猜这是因为我试图访问的属性。我不确定如何设置它。我对 lambda 不是很好(并且还没有找到关于它们的教程)所以我不确定我是否可以通过一些不同的方式来安排它以使其工作。

或者如果我完全没有达到目标。

最佳答案

答案在异常消息中:

... Only property accesses are supported in intermediate invocations on a setup ...

试试这个:

var user = new Mock<MemberShipUser>();
user.SetupGet(x => x.PasswordQuestion).Returns("Password");

membershipMock.Setup(m => m.GetUser("test", false)).Returns(user.Object);

关于c# - 我该如何设置(最小起订量设置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1052689/

相关文章:

python - 模拟 itertools.zip_longest

javascript - 有没有办法模拟请求对象的属性

c# - UserControl 具有传播到内部控件的绑定(bind)

c# - 有没有办法指定 where T :new() restriction but with internal constructor?

angular - 如何在 Angular 单元测试中创建伪造的 NgForm 对象?

php - mock __call() 有不同的签名

c# - 取消长时间运行的 Entity Framework 6 异步请求

c# - 这个 C# 代码是如何用函数式语言(F#?Haskel?)完成的

PHPUnit:期望方法含义

mocking - 如果 Minitest 有 stub 和模拟,为什么要使用 mocha gem?