首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置(Moq设置)

如何设置(Moq设置)
EN

Stack Overflow用户
提问于 2009-06-27 11:38:16
回答 2查看 21.8K关注 0票数 12

我想测试返回用户密码问题的那部分代码。因此,我使用Moq创建了一个成员提供程序的模型。

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

代码语言:javascript
运行
复制
// 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中运行它时,我得到了这个:

代码语言:javascript
运行
复制
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

因此,我猜测这是因为我试图访问的属性。我不确定如何设置它。我对lambdas不是很擅长(而且还没有找到关于lambdas的教程),所以我不确定我是否可以用不同的方式安排它来使它工作。

或者是我完全没说中要害。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-27 11:58:26

答案在异常消息中:

...在设置的中间调用中仅支持属性访问...

试试这个:

代码语言:javascript
运行
复制
var user = new Mock<MemberShipUser>();
user.SetupGet(x => x.PasswordQuestion).Returns("Password");

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

Stack Overflow用户

发布于 2009-06-27 12:24:18

我认为它引用的中间调用是这样的:m.GetUser("test", false),因为它后面跟着.PasswordQuestion。它的意思是:您不能将方法用作中间存根,只能将其用作属性。这个特定的框架似乎确实支持中间存根(即存根定义中的X.Y结构,请注意点),但大多数其他框架不支持。

存根并不神奇,它们所能做的就是截获您的调用,并用您提供的值替换返回的结果。在本例中,您的GetUser存根需要返回一个模拟用户,并将其密码存根去掉以返回“PasswordQuestion”。

代码的另一个问题是直接模拟MembershipProvider。大多数模拟框架的工作方式是,如果你模拟一个接口,它们会动态生成一个实现它的类,而当你模拟一个类时,它们会生成一个继承它并覆盖任何虚拟方法的类。然而,如果方法不是虚拟的,它不能覆盖它,因此你可能会观察到混合的行为。我建议您查看是否有类似IMembershipProvider的接口,如果有,请在代码中使用它,而不是具体的类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1052689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档