我有一个简单的silverlight单元测试,它没有按预期工作:
DataContext context = Mock.Create<DataContext>(Constructor.Mocked);
List<Resource> resources = new List<Resource>();
Resource resource = new Resource
{
ContentType = "string",
Data = Encoding.UTF8.GetBytes("Test")
};
Mock.Arrange(() => context.Resources.Add(resource)).DoInstead(() => resources.Add(resource));
Mock.Arrange(() => context.Resources.SingleOrDefault()).Returns(resources.SingleOrDefault());
context.Resources.Add(resource);
var loaded = context.Resources.SingleOrDefault();
将资源属性正确添加到本地资源(context.Resources.Add(resource))列表中,但是当我尝试将其读回时(context.Resources.SingleOrDefault())则不会返回任何内容。
答案 0 :(得分:3)
为了返回resources.SingleOrDefault()
的更新值,您需要在排列中使用lambda表达式,如下所示:
Mock.Arrange(() => context.Resources.SingleOrDefault())
.Returns(() => resources.SingleOrDefault());
否则,当调用context.Resources.SingleOrDefault()
方法时,mock将返回null,这是安排时resources.SingleOrDefault()
调用的值。
答案 1 :(得分:3)
我不认为你应该对.SingleOrDefault进行抄袭。它是.NET FW System.Lynq扩展,并且经过了很好的测试。为什么我的意思是经过充分测试意味着存在这种方法的真正意义。你总是认为它总是给出SingleOrDefault实例。
使用单元测试,您可以存根由资源返回的集合列表。然后只需访问SingleOrDefault。以下测试通过
[TestMethod]
public void YourReadableTestMethod()
{
var context = Mock.Create<DataContext>(Constructor.Mocked);
context.Resources = new List<Resource>();
var resources = new List<Resource>();
var resource = new Resource {
ContentType = "string",
Data = Encoding.UTF8.GetBytes("Test")
};
resources.Add(resource);
Mock.Arrange(() => context.Resources).ReturnsCollection(resources);
context.Resources.Add(resource);
var loaded = context.Resources.SingleOrDefault();
Assert.IsNotNull(loaded);
}