我遇到了一个问题,我试图模拟一个包含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;的对象?属性?
答案 0 :(得分:5)
尝试使用以下任何一种方法:
mockModel.Setup(m => m.Items).Returns(listItem);
mockModel.SetupGet(m => m.Items).Returns(listItem);
如果要跟踪其值,请使用方法SetupProperty
,请参阅moq wiki。虽然我不确定为什么SetupProperty
失败,因为它的意图是能够分配和检索属性值,但它似乎可能是由私有获取引起的。
为清楚起见,我们假设您的财产有一套公共场所。在使用Setup
或SetupGet
的情况下,执行类似mockModel.Object.Items = new List<ItemList>();
的操作无效,您仍会看到包含单个项目的列表。但是对于SetupProperty
,同一语句会更改属性返回的值。
基本上SetupProperty
允许获取和设置属性的值,这就是为什么我认为它不能与私有集一起使用。