Moq虚拟ICollection<>具有私有集的属性:“非虚拟上的无效设置”

时间:2013-06-07 15:44:31

标签: c# nunit moq icollection

我遇到了一个问题,我试图模拟一个包含Items类型属性ICollection<>的对象。我收到以下错误:

  

System.NotSupportedException:非虚拟(VB中可覆盖)成员的设置无效:m =&gt; m.Items

问题是属性项目已经是虚拟

我在下面的Sandbox中重现了我在项目中遇到的错误:

public class ItemList
{
    public virtual int Id { get; set; }
}

public class SpecialList
{
    public virtual string Token { get; internal set; }
    public virtual ICollection<ItemList> Items { get; private set; }
}

当我尝试SetupProperty时,我的测试中会出现错误:

[TestFixture]
public class TestSpecialList
{
    [Test]
    public void Mocking_Virtual_ICollection()
    {
        var mockModel = new Mock<SpecialList>();
        var listItem = new List<ItemList> {new ItemList {Id = 007}};

        mockModel.SetupProperty(m => m.Items, listItem);
    }
}

我做错了吗?是否可以向Moq提供包含ICollection&lt;&gt;的对象?属性?

1 个答案:

答案 0 :(得分:5)

尝试使用以下任何一种方法:

mockModel.Setup(m => m.Items).Returns(listItem);
mockModel.SetupGet(m => m.Items).Returns(listItem);

如果要跟踪其值,请使用方法SetupProperty,请参阅moq wiki。虽然我不确定为什么SetupProperty失败,因为它的意图是能够分配和检索属性值,但它似乎可能是由私有获取引起的。

为清楚起见,我们假设您的财产有一套公共场所。在使用SetupSetupGet的情况下,执行类似mockModel.Object.Items = new List<ItemList>();的操作无效,您仍会看到包含单个项目的列表。但是对于SetupProperty,同一语句会更改属性返回的值。

基本上SetupProperty允许获取和设置属性的值,这就是为什么我认为它不能与私有集一起使用。