在单元测试C#中使用setup是正确的

时间:2017-07-07 18:41:16

标签: c# unit-testing justmock arrange-act-assert

我正在更好地解释,我正在研究如何使用NUnit和justmock在C#中进行单元测试。我正在阅读本书单元测试的艺术,在这里我被告知尽可能尝试避免[SetUp]以前的场景配置。但在博客上搜索我,如果在[SetUp]中使用这些设置很好,我真的很困惑, 我知道,如果场景非常大,我的测试方法的安排会增长,我必须进行实际考验,Entonce将会提出最好的问题, 当使用[SetUp]或者当要测试的场景非常大并且编码受此影响时,如果存在某种类型的模式,请帮助???

例如:

[TestMethod]
    [Owner("Joaquin")]
    public void Update_CorrectViewDtoAndAllowedUser_ReturnsTrue()
    {
        // Arrange
        const string userName = "johndoe";
        var viewDto = new ViewDto { Id = 1 };
        var view = new View { Id = 1 };

        var authorizationService = Mock.Create<IAuthorizationService>();
        Mock.Arrange(() => authorizationService.GetAccessLevel(viewDto.Id,userName))
            .Returns(AccessLevel.ReadWrite);

        var mapper = Mock.Create<ITypeMapperService>();
        Mock.Arrange(() => mapper.Map<View>(Arg.Is(viewDto)))
            .Returns(view);

        var viewService = Mock.Create<IViewService>();
        Mock.Arrange(() => viewService.GetById(view.Id))
            .Returns(view);

        var viewAppService = CreateViewAppService(viewService, authorizationService, mapper);

        // Act
        var result = viewAppService.Update(viewDto, userName);

        // Assert
        Assert.IsTrue(result);
    }

这里我的安排非常广泛,我不想删除私有方法或将其传递给[SetUp]没有模式以另一种方式解决这个问题

1 个答案:

答案 0 :(得分:2)

SetUp的主要问题是,NUnit对其中的所有测试使用TestFixture的一个实例。所有单元测试都可以对状态进行更改。

主要问题是,单元测试没有执行顺序。剩下的状态可以打破以下单元测试。像这样的错误很难找到。 (并且可能取决于您的测试环境。您的构建服务器可以获得不同的测试结果,然后是您的本地计算机。)

使用SetUp没有问题,只要您重置TearDown中所有已更改的状态即可。

另一种方法是使用XUnit,它不会对所有测试使用相同的实例。 SetUp在构造函数中完成,因为不重用该类,所以不需要清理。

编辑:但正如你所说,你正在阅读“单元测试的艺术”。这本书有几乎完整的章节来解决这个问题。并且可能会比我更好地解释这一点;)