【问题标题】:using moq - Unit test for void methods c#使用 moq - void 方法的单元测试 c#
【发布时间】:2020-06-30 15:29:55
【问题描述】:

我想为此 FirstPageLoad 方法编写单元测试。这是一个 void 方法,所以我不知道如何为这个 void 方法编写单元测试。

public class PagingSevice : IPagingService
{
    private EventHandler<PageEventArgsHelper> pageEventArgs;

    private List<string> PageGuids; 

    public void FirstPageLoad()
    {
        SetPageLoading(0);
    }

    public void SetGuids(List<string> pageGuids)
    {
        PageGuids = pageGuids;
    }


    private void SetPageLoading(int pageNumber)
    {
        if (!PageGuids.Any())
        {
            PageEventArgsHelper page = new PageEventArgsHelper(string.Empty, true, true);
            pageEventArgs?.Invoke(this, page);
            return;
        }

        bool isFirst = false;
        bool isLast = false;
        if (pageNumber == 0)
        {
            isFirst = true;
        }

        if (PageGuids.Count -1 == pageNumber)
        {
            isLast = true; 
        }

        PageEventArgsHelper pageArgs = new PageEventArgsHelper(PageGuids[pageNumber], isFirst, isLast);
        pageEventArgs?.Invoke(this, pageArgs);
    }
}

我可以使用 moq.verify 来测试这个方法吗?

【问题讨论】:

  • 当然。你试过什么?
  • @mm8:他们在问如何去做。
  • 我使用了 moq.verify。但我不知道它是否正确。
  • 为什么不呢?您要验证什么方法?
  • @KSameera:那么测试中唯一的值就是确认没有抛出异常。没有什么可嘲笑的。只需创建对象的一个​​实例并调用该方法。如果没有抛出异常,则测试通过。

标签: c# unit-testing moq mstest


【解决方案1】:

在这种情况下返回 void 的方法没有什么特别之处。您只需调用该方法并使用Verify 方法来验证它是否像往常一样被调用,例如:

var mock = new Mock<IPagingService>();
mock.Object.FirstPageLoad();
mock.Verify(x => x.FirstPageLoad(), Times.Once);

您可能还想在调用公共FirstPageLoad 方法时通过SetPageLoading 方法验证event was raised

【讨论】:

  • pageGuids 列表呢?我需要使用 setguids 向 pageguids 添加值吗?
  • 这确实引出了测试价值的问题。在这个例子中,对象根本没有被测试。创建对象的模拟,并且测试仅验证模拟存在并且可以调用。如果此测试失败,则不是对象有问题,而是模拟框架有问题。
  • @David:答案试图回答如何对 void 方法进行单元测试的实际问题。
  • @KSameera: SetGuids 确实为PageGuids 添加了值,但由于后者是私有的,因此如果不使用反射,您将无法对其进行测试。
【解决方案2】:

基于上述问题的cmets...

SetPageLoading(0) 是否有可观察到的副作用? ->
它是否修改了对象中可以从外部看到的任何内容? ->
它会修改依赖项中的任何内容吗? ->

听起来对结果的唯一观察是“没有抛出异常”。为此,您不需要嘲笑任何东西,甚至不需要断言任何东西。在任何测试框架中,意外的异常都会导致测试失败。所以只要没有异常,测试就通过了。一些简单的事情:

// arrange
var service = new PagingService();

// act
service.FirstPageLoad();

// assert
// no exception is thrown

现在,不太了解这个对象的作用,如果在这种情况下由于未满足外部依赖关系而导致失败,那么 that 将是外部可观察到的副作用.

我没有看到构造函数或任何注入依赖项的方法。因此,如果有一个,那么构建单元测试是一个反转该依赖关系的机会,以便可以将其提供给对象。但是,如果没有,并且所有事情都在对象内私下发生,那么该功能就是一个黑匣子,可以观察到的只是没有异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2017-05-11
    • 2022-01-02
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多