使用Moq通过任何键和值设置任何

Dig*_*der 11 c# unit-testing indexer moq

在问题的最后: 使用Moq在C#中设置索引器,有一个问题是有人突出显示了我遇到的问题.但他们没有找到解决方案.

具体来说,我正在尝试使用泛型It.IsAny<string>作为键的匹配器并通过设置值It.IsAny<object>.通过索引访问并设置值时,它永远不会匹配,也不会访问我的回调方法.所以我的单元测试失败了.

var stateTable = new HashTable;
var httpSession = new Mock<HttpSessionStateBase>();

//works via httpSession.Add(key, value);
httpSession.Setup(x => x.Add(It.IsAny<string>(), It.IsAny<object>()))
    .Callback((string index, object value) => {
        var i = index;
        var v = value;

            stateData[i] = v;
    });

//does not work via httpSession[key] = value;
httpSession.SetupSet(x => x[It.IsAny<string>()] = It.IsAny<object>())
    .Callback( (string index, object value) => {
        var i = index;
        var v = value;

        stateData[i] = v;
});
Run Code Online (Sandbox Code Playgroud)

我正在使用Moq 4.0.10827

Mat*_*ela 8

根据我的经验,这永远不会有效,你不能使用It.IsAny作为索引器表达式中的匹配器.但是,如果在索引器中放置具体值,它将匹配.例如,以下内容确实有效:

httpSession.SetupSet(x => x["someValue"] = It.IsAny<object>())
    .Callback( (string index, object value) => {
        var i = index;
        var v = value;

        stateData[i] = v;
});
Run Code Online (Sandbox Code Playgroud)

  • 我今天早上在Moq邮件列表中发布了对这篇文章和示例测试用例的引用.@kzu已经看过帖子,听起来有人同意这个和相应的误导性错误信息都需要修复. (2认同)
  • 这个问题实际上已经有一段时间了,但我可以确认这个问题仍然很不幸。更多细节在这里:https://github.com/Moq/moq4/issues/218。 (2认同)