使用MOQ测试此代码的正确方法是什么?

时间:2012-05-01 08:54:43

标签: c# moq

我有以下方法:

    public void MoveChannelUp(string channelName)
    {
        var liveChannels = _repository.GetChannels<LiveChannel>();

        var channels = GetModifiedChannelsList(channelName, liveChannels);

        _repository.SaveChannels(channels);
    }

我想在SaveChannels()调用上设置一个期望值,以便传入正确的channels参数。

我试过了:

   channelsRepository.Setup(x => x.SaveChannels(reorderedChannels));

其中reorderedChannels是我期望GetModifiedChannelsList()调用将返回的,但我得到Mock验证异常(可能是因为重新排序的Channels与通道不是同一个对象???)

所以我真的想测试它是GetModifiedChanneslsList()(我知道我可以使用反射来测试它)

那么如何测试正确的频道列表是否传递给SaveChannels()?

1 个答案:

答案 0 :(得分:3)

你可以做这样的事情(我假设有一个名为Channel的类型,而SaveChannels的参数是List<Channel>;用实际代替:

var expectedChannels = new List<Channel> { new Channel() }; // set up expected channels here

var channelsRepo = new Mock<IChannelsRepository>();

// perform your unit test using channelsRepo here, for example:

channelsRepo.Object.SaveChannels(new List<Channel> { new Channel() });

channelsRepo.Verify(x => x.SaveChannels(It.Is<List<Channel>>(l => l.SequenceEqual(expectedChannels)))); // will throw an exception if call to SaveChannels wasn't made, or the List of Channels params did not match the expected.

此代码的作用是验证使用正确的通道列表至少调用SaveChannels方法一次。如果没有发生,Verify将抛出异常,您的单元测试将按预期失败。