Moq:如何使用 Mock.Of<> 在对象上调用方法

Moq: How to call method on a object with Mock.Of<>

在下面的语句中,我想将 Navigation 对象的 IsNew 标志设置为 false 然后 return false 到在该对象上调用的方法 IsCurrentStepUnlocked

然而,在第 4 行,当我检索 IsNew 的值时,它是 'true'

我似乎没有得到两者,在对象上设置值并将某些东西设置为 return 预定值。

1. var mockStatementInformation = Mock.Of<IStatementInformation>();
2. mockStatementInformation.Navigation = new Navigation { IsNew = false };
3. Mock.Get(mockStatementInformation).Setup(x => x.Navigation.IsCurrentStepUnlocked()).Returns(false);

4. var isNew = mockStatementInformation.Navigation.IsNew;

导航,简单定义如下。

public class Navigation
{        
    public Navigation()
    {
       IsNew = true;
    }

    public bool IsNew { get; set; }
}

如何使用 Moq 设置嵌套 属性 或对其调用方法?

参考:Moq Quickstart - linq-to-mocks

假设这个例子

public interface IStatementInformation {

    Navigation Navigation { get; set; }
}

public class Navigation {

    public Navigation() {
        IsNew = true;
    }

    public virtual bool IsNew { get; set; }

    public virtual bool IsCurrentStepUnlocked() {
        return true;
    }
}

其中方法和 属性 return 默认为真。

像这样测试结果符合预期

var mockStatementInformation = Mock.Of<IStatementInformation>(m =>
    m.Navigation == new Navigation { IsNew = false } &&
    m.Navigation.IsCurrentStepUnlocked() == false
);

Assert.IsFalse(mockStatementInformation.Navigation.IsCurrentStepUnlocked());
Assert.IsFalse(mockStatementInformation.Navigation.IsNew);