我正在编写一个使用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
以外什么都没有使用,因此我认为应该捕获所有执行,但事实并非如此。设置中定义的类型匹配模拟方法的方法参数。我不知道为什么会给我麻烦。
感谢您的帮助!让我知道您是否想看到其他任何东西。
您需要确保您的MockController的InternalBuyerProfilePost方法不仅被声明为受保护,而且还被声明为 Overrides 基础类的InternalBuyerProfilePost方法。否则,默认情况下,它将遮蔽方法,而不是覆盖它,这将导致您描述的问题。
在您的第一个参数中,您有It
而不是ItExpr
。如果It.IsAny<int>()
被称为(与表达树中的表示相反),则返回0
。也许您仅Setup
第一个参数为零的情况?尝试使用ItExpr
。
如果您将mockController
更改为模拟行为Strict
,如果您调用某个不正确的Setup
的某些情况。