我在编写单元测试时遇到了一个问题,在我调用它的方法中,它没有修改我传入的模拟对象。我不确定是否有一些明显的东西我是丢失?
我按照以下方式设置了模拟:
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
。无论如何设置该属性以接受修改?
我这样做的原因是测试文档集合是否已被方法中的另一个集合修改。不确定是否有更好的方法可以做到这一点?
答案 0 :(得分:2)
mockDocument.SetupProperty(doc => doc.DocumentName);
,它会将该属性实现为常规自动属性。如果您希望自动实现所有属性,则可以使用mockDocument.SetupAllProperties()
,但您仍需要为每个模拟对象执行此操作。
您还可以考虑制作存根而不是模拟:
public class StubDocument : IDocument
{
public string DocumentNo { get; set; }
public string DocumentName { get; set; }
...
}
一般来说,我发现在处理非常简单的界面时,存根通常比模拟更可取,就像IDocument
的情况一样。