正在执行模拟保护方法的基本版本

时间:2015-05-08 20:16:09

标签: c# unit-testing moq

我正在使用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传递给AccessibleClientsrbClients。但是,当我调用BuyerProfile时,将执行InternalBuyerProfilePost的基本版本而不是模拟版本。我不确定这里发生了什么。由于我的设置只使用It/ItExpr,我认为它应该捕获所有执行,但事实并非如此。设置中定义的类型与模拟方法的方法参数匹配。我不知道为什么这会给我带来麻烦。

感谢您的帮助!如果你想看到别的什么,请告诉我。

2 个答案:

答案 0 :(得分:1)

您需要确保您的mockController的InternalBuyerProfilePost方法不仅被声明为受保护,而且覆盖基类的InternalBuyerProfilePost方法。否则,默认情况下,它会遮挡方法而不是覆盖它,这会导致您所描述的问题。

答案 1 :(得分:0)

在您的第一个参数中,您有{{ formattedText }}而不是It。如果ItExpr 被称为(而不是在表达式树中表示),则返回It.IsAny<int>()。也许你只有0第一个参数为零的情况?请尝试使用Setup

如果您将ItExpr更改为具有模拟行为mockController,那么如果您调用的内容不正确Strict,系统会通知您。