3

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

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

问题是属性Items 已经是 virtual

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

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

难道我做错了什么?是否可以最小化包含 ICollection<> 属性的对象?

4

1 回答 1

5

尝试使用以下任何一种:

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

SetupProperty当您想要跟踪其价值时使用该方法,请参阅moq wiki。虽然我不确定为什么会SetupProperty失败,因为它的目的是能够评估和检索属性值,但它似乎很可能是由私有 get 引起的。

为了清楚起见,让我们假设您的财产有一个公共集。在这种情况下,使用Setupor时SetupGet,执行类似的操作mockModel.Object.Items = new List<ItemList>();不会产生任何效果,您仍然会看到包含单个项目的列表。但是,SetupProperty使用相同的语句会更改属性返回的值。

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

于 2013-06-07T16:02:29.223 回答