For*_*gic 3 c# nunit moq icollection
我遇到了一个问题,我试图模拟一个包含Items类型属性的对象ICollection<>.我收到以下错误:
System.NotSupportedException:非虚拟(在VB中可覆盖)成员上的无效设置:m => m.Items
问题是属性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; }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试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);
}
}
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?Moq是否可以包含一个包含ICollection <>属性的对象?
尝试使用以下任何一种:
mockModel.Setup(m => m.Items).Returns(listItem);
mockModel.SetupGet(m => m.Items).Returns(listItem);
Run Code Online (Sandbox Code Playgroud)
SetupProperty当您想要跟踪其值时使用该方法,请参阅moq wiki.虽然我不确定为什么会SetupProperty失败,因为它的目的是能够分配和检索财产价值,但它似乎可能是由私人获取引起的.
为了清楚起见,我们假设您的房产有一套公共场所.在这种情况下,当使用Setup或SetupGet执行类似的操作时mockModel.Object.Items = new List<ItemList>();,您仍会看到包含单个项目的列表.但是,SetupProperty使用相同的语句会更改属性返回的值.
基本上SetupProperty允许获取AND SET属性的值,这就是为什么我认为它不能与私有集一起使用.