代码之家  ›  专栏  ›  技术社区  ›  sourcenouveau

使用MOQ在C中设置索引器#

  •  19
  • sourcenouveau  · 技术社区  · 15 年前

    我想不出怎么设置 indexers 在C和MoQ中。MOQ文档很弱,我做了很多搜索…我想做的是类似于 How to Moq Setting an Indexed property :

    var someClass = new Mock<ISomeClass>();
    someClass.SetupSet(o => o.SomeIndexedProperty[3] = 25);
    

    我想修改上面的内容以适用于任何索引和任何值,这样我就可以这样做:

    someClass.Object.SomeIndexedProperty[1] = 5;
    

    目前我有以下功能,这对索引属性getter很有用,但是如果我曾经设置过值,moq会忽略它:

    var someValues = new int[] { 10, 20, 30, 40 };
    var someClass = new Mock<ISomeClass>();
    someClass.Setup(o => o.SomeIndexedProperty[It.IsAny<int>()])
        .Returns<int>(index => someValues[index]);
    
    // Moq doesn't set the value below, so the Assert fails!
    someClass.Object.SomeIndexedProperty[3] = 25;
    Assert.AreEqual(25, someClass.Object.SomeIndexedProperty[3]);
    
    3 回复  |  直到 10 年前
        1
  •  11
  •   sourcenouveau    15 年前

    我找到了解决问题的办法。这需要我改变主意…我一直想用努尼特的 Assert 验证我的 someClass 调用mock时使用了正确的值。

    看起来,对于moq,支持的方法是使用 VerifySet 功能。人为的例子:

    someClass.Object.SomeIndexedProperty[3] = 25;
    someClass.VerifySet(mock => mock.SomeIndexedProperty[3] = 25);
    

    单元测试通过自 SomeIndexedProperty[3] 设置为25,否则将失败。

        2
  •  5
  •   Gishu    14 年前

    使用MOQ 3.1.416.3

    安装程序不适用于索引器(因为它采用的表达式意味着排除了赋值语句)

    所以你需要像

    _settingsStore.SetupSet(store => store["MruNotes"] = It.IsAny<string>())
                    .Callback<string,string>( (key, value) => persistedValue = value);
    

    一个小小的警告: 此表达式仅在键为“mrunotes”时匹配。我不能用像这样的火柴。我拿钥匙。

        3
  •  3
  •   I.G. Pascual    10 年前

    在您的测试中,您只设置了索引器getter的期望值——这将始终从数组中返回相应的值。索引器的行为不像真实的东西。您可以尝试一些方法来修复它:

    1. 您可以检查是否可以存根这个索引器。我个人正在使用犀牛模型,所以我不知道是否能实现这一点。

      someClass.SetupProperty(f => f.SomeIndexedProperty);
      
    2. 您也可以尝试模拟setter并使其更改底层数组。我的第一个猜测是沿着这些路线尝试一些东西(不保证它会起作用):

      someClass.Setup(o => o.SomeIndexedProperty[It.IsAny<int>()] = It.IsAny<int>())
      .Callback((index, value) => someValues[index] = value);
      
    3. 或者,如果isomeclass接口足够小,您可以自己创建一个存根实现(将索引器实现为字典、数组等)。