Telerik JustMock没有调用预期的安排方法

时间:2013-11-26 14:41:27

标签: silverlight unit-testing justmock

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

2 个答案:

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