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



我正在编写一个使用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以外什么都没有使用,因此我认为应该捕获所有执行,但事实并非如此。设置中定义的类型匹配模拟方法的方法参数。我不知道为什么会给我麻烦。

感谢您的帮助!让我知道您是否想看到其他任何东西。

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

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

如果您将mockController更改为模拟行为Strict,如果您调用某个不正确的Setup的某些情况。

最新更新