C# 最小起订量a虚拟ICollection<&燃气轮机;具有私有集的属性:";非虚拟设备上的设置无效;

C# 最小起订量a虚拟ICollection<&燃气轮机;具有私有集的属性:";非虚拟设备上的设置无效;,c#,nunit,moq,icollection,C#,Nunit,Moq,Icollection,我遇到了一个问题,我试图模拟一个对象,该对象包含类型为ICollection的属性Items。我得到以下错误: System.NotSupportedException:非虚拟(在VB中可重写)成员上的设置无效:m=>m.Items 问题是属性项已经是虚拟的 我在下面的沙箱中重现了我在项目中遇到的错误: public class ItemList { public virtual int Id { get; set; } } public class SpecialList {

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

System.NotSupportedException:非虚拟(在VB中可重写)成员上的设置无效:m=>m.Items

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

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

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; }
}

我做错什么了吗?是否可以删除包含ICollection属性的对象?

尝试使用以下任一选项:

mockModel.Setup(m => m.Items).Returns(listItem);
mockModel.SetupGet(m => m.Items).Returns(listItem);
要跟踪其值时,将使用方法
SetupProperty
,请参阅。虽然我不确定
SetupProperty
为什么会失败,因为它的目的是能够分配和检索属性值,但它似乎很可能是由私有get引起的

为了清楚起见,让我们假设您的属性有一个公共集。在这种情况下,当使用
Setup
SetupGet
时,执行类似于
mockModel.Object.Items=new List()的操作
将不起作用,您仍然可以看到包含单个项的列表。但是,使用
SetupProperty
时,相同的语句会更改属性返回的值


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

你能做mockModel.object.items=listItem吗?@user1168234在我的情况下不能,因为该集必须是私有的。对,我做了一些测试,它似乎是
私有集
,正如您所指出的,但是如果我将其设置为内部,它会工作!!!虽然我不能让他们内部,所以我会测试你的解决方案伟大!刚刚添加了更多信息:)它确实有效!:D非常感谢您澄清概念和快速回答。我以前使用过Setup().Returns,但我不知道为什么我认为在这种情况下不能再次使用它。@ForceMagic太棒了!很乐意帮忙!
mockModel.Setup(m => m.Items).Returns(listItem);
mockModel.SetupGet(m => m.Items).Returns(listItem);