代码之家  ›  专栏  ›  技术社区  ›  James Kolpack

如何设置索引属性

  •  9
  • James Kolpack  · 技术社区  · 15 年前

    我正在尝试使用mock来验证是否设置了索引属性。下面是一个具有索引的moq-able对象:

    public class Index
    {
        IDictionary<object ,object> _backingField 
            = new Dictionary<object, object>();
    
        public virtual object this[object key]
        {
            get { return _backingField[key]; }
            set { _backingField[key] = value; }
        }
    }
    

    首先,尝试使用 Setup() :

    [Test]
    public void MoqUsingSetup()
    {
        //arrange
        var index = new Mock<Index>();
        index.Setup(o => o["Key"]).Verifiable();
        // act
        index.Object["Key"] = "Value";
        //assert
        index.Verify();
    }
    

    …失败了-它肯定在验证 get{}

    所以,我试着用 SetupSet() :

    [Test]
    public void MoqUsingSetupSet()
    {
        //arrange
        var index = new Mock<Index>();
        index.SetupSet(o => o["Key"]).Verifiable();
    }
    

    …它给出一个运行时异常:

    System.ArgumentException : Expression is not a property access: o => o["Key"]
    at Moq.ExpressionExtensions.ToPropertyInfo(LambdaExpression expression)
    at Moq.Mock.SetupSet(Mock mock, Expression`1 expression)
    at Moq.MockExtensions.SetupSet(Mock`1 mock, Expression`1 expression)
    

    正确的方法是什么?

    1 回复  |  直到 15 年前
        1
  •  8
  •   Shane Fulmer Lasse V. Karlsen    15 年前

    这应该管用

    [Test]
    public void MoqUsingSetup()
    {
        //arrange
        var index = new Mock();
        index.SetupSet(o => o["Key"] = "Value").Verifiable();
        // act
        index.Object["Key"] = "Value";
        //assert
        index.Verify();
    }

    你可以把它当作一个普通的属性设置器。