使用最小起订量 - void 方法的单元测试 c#

using moq - Unit test for void methods c#

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

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 来测试这个方法吗?

在此上下文中 returns void 的方法没有什么特别之处。您只需调用该方法并使用 Verify 方法来验证它是否像往常一样被调用,例如:

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

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

根据对上述问题的评论...

Is there an observable side-effect from SetPageLoading(0)? -> No
Does it modify anything in the object which can be seen externally? -> No
Does it modify anything in a dependency? -> No

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

// arrange
var service = new PagingService();

// act
service.FirstPageLoad();

// assert
// no exception is thrown

现在,不太了解这个对象的作用,如果在这种情况下因为没有满足外部依赖性而导致失败,那么 that 将是外部可观察到的副作用。

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