1

我有一个简单的 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()) 没有返回任何内容。

4

2 回答 2

3

为了返回 的更新值resources.SingleOrDefault(),您需要在排列中使用 lambda 表达式,如下所示:

Mock.Arrange(() => context.Resources.SingleOrDefault())
    .Returns(() => resources.SingleOrDefault());

否则,context.Resources.SingleOrDefault()调用该方法时,mock会返回null,也就是resources.SingleOrDefault()排列时调用的值。

于 2013-11-27T12:16:05.363 回答
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);
    }   
于 2013-11-28T09:53:12.997 回答