我正在使用Moq编写测试来验证受保护方法的参数。我正在设置受保护的方法如下:
RedirectResult expectedResult = new RedirectResult("http://www.google.com");
mockController.Protected()
.Setup<ActionResult>(
"InternalBuyerProfilePost",
It.IsAny<int>(),
ItExpr.IsAny<IList<PermissionArea>>(),
ItExpr.IsAny<IList<int>>(),
ItExpr.IsAny<IList<int>>(),
ItExpr.IsAny<IList<int>>(),
ItExpr.IsAny<int?>(),
ItExpr.IsAny<int?>(),
ItExpr.IsAny<int?>(),
ItExpr.IsAny<int?>())
.Returns(expectedResult);
实际方法sig如下所示:
protected virtual ActionResult InternalBuyerProfilePost(
int centralUserInt, IList<PermissionArea> PermissionAreas,
IList<int> AccessiblePropertyGroups, IList<int> AccessibleBuyers, IList<int> AccessibleClients,
int? assignableCompanyInt, int? rbProperties, int? rbContacts, int? rbClients)
InternalBuyerProfilePost
被称为:
[HttpPost]
public ActionResult BuyerProfile(int userInt, IList<PermissionArea> PermissionAreas,
IList<int> AccessiblePropertyGroups, IList<int> AccessibleBuyers,
int? assignableCompanyInt, int? rbStations, int? rbContacts)
{
return InternalBuyerProfilePost(userInt, PermissionAreas, AccessiblePropertyGroups,
AccessibleBuyers, null, assignableCompanyInt, rbStations,
rbContacts, null);
}
并将null传递给AccessibleClients
和rbClients
。但是,当我调用BuyerProfile
时,将执行InternalBuyerProfilePost
的基本版本而不是模拟版本。我不确定这里发生了什么。由于我的设置只使用It/ItExpr
,我认为它应该捕获所有执行,但事实并非如此。设置中定义的类型与模拟方法的方法参数匹配。我不知道为什么这会给我带来麻烦。
感谢您的帮助!如果你想看到别的什么,请告诉我。
答案 0 :(得分:1)
您需要确保您的mockController的InternalBuyerProfilePost方法不仅被声明为受保护,而且覆盖基类的InternalBuyerProfilePost方法。否则,默认情况下,它会遮挡方法而不是覆盖它,这会导致您所描述的问题。
答案 1 :(得分:0)
在您的第一个参数中,您有{{ formattedText }}
而不是It
。如果ItExpr
被称为(而不是在表达式树中表示),则返回It.IsAny<int>()
。也许你只有0
第一个参数为零的情况?请尝试使用Setup
。
如果您将ItExpr
更改为具有模拟行为mockController
,那么如果您调用的内容不正确Strict
,系统会通知您。