修改模拟对象的返回属性值

时间:2013-09-03 10:26:05

标签: c# unit-testing moq

我在编写单元测试时遇到了一个问题,在我调用它的方法中,它没有修改我传入的模拟对象。我不确定是否有一些明显的东西我是丢失?

我按照以下方式设置了模拟:

var mockList = new List<Mock<IDocument>>();

for (int i = 0; i < 4; i++)
{
    var mockDocument = new Mock<IDocument>();
        mockDocument.Setup(t => t.DocumentNo).Returns(i.ToString()); 
        mockList.Add(mockDocument);
}

mockDocumentRepository.Setup(x => x.GetDocuments(It.IsAny<string>(), It.IsAny<string>()))
    .Returns(mockList.Select(m => m.Object).ToList());

在执行的方法中,如果我尝试修改模拟类的另一个属性(例如t.DocumentName),则值仍为Null。无论如何设置该属性以接受修改?

我这样做的原因是测试文档集合是否已被方法中的另一个集合修改。不确定是否有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

除非另有指示,否则Moq将保留所有未实现的方法,包括属性。如果您使用mockDocument.SetupProperty(doc => doc.DocumentName);,它会将该属性实现为常规自动属性。如果您希望自动实现所有属性,则可以使用mockDocument.SetupAllProperties(),但您仍需要为每个模拟对象执行此操作。

您还可以考虑制作存根而不是模拟:

public class StubDocument : IDocument
{
    public string DocumentNo { get; set; }
    public string DocumentName { get; set; }
    ...
}

一般来说,我发现在处理非常简单的界面时,存根通常比模拟更可取,就像IDocument的情况一样。