【问题标题】:testing status changes rules测试状态更改规则
【发布时间】:2011-02-04 09:46:21
【问题描述】:

我在域模型中有一个实体。该实体具有 ChangeStatus(StatusesEnum newStatus) 方法。 StatusesEnum 有超过 10 个成员。它们只能按正确的顺序更改,例如 StatusesEnum.First 可以更改为 Second 和 Third,Third 只能更改为 Fourth,Fourth 可以更改为 Fifth 和 Seventh 等。

ChangeStatus 方法为错误的转换抛出异常。 我不认为测试所有情况都是正确的(也许我错了:)),但是我如何编写测试来检查正确的转换顺序。

【问题讨论】:

    标签: .net unit-testing testing nunit


    【解决方案1】:
    > how can I write test for checking right transitions order.
    

    如果您使用的是 NUnit 2.5 或更高版本,您可以使用 Parameterized Tests

        [Test, Sequential]
        public void MyTest(
            [Values(State1,State2,State99)] StatusesEnum initialState,
            [Values(State2,State3,State1)] StatusesEnum nextState,
            [Values(true, true, false)] bool expectedOutcome
            )
        {
            Entity entity = new Entity(initialState);
            if (expectedOutcome)
                entity.ChangeStatus(nextState); // this should be ok
            else {
                try {
                    entity.ChangeStatus(nextState); 
                                                  // this should throw
                    Assert.Fail("Missing expected Exception");
                } catch (IllegaleStateTransitionException ex) {
                    // every thing is ok
                }
            }
    
            ...
        }
    

    但是,如果我是你,我会创建一个非投掷决策函数

        IsValidTransition(StatusesEnum oldState, StatusesEnum newState)
    

    将在您的状态逻辑中使用并在 unittest 中进行测试,因此不再需要 测试异常逻辑

    【讨论】:

      【解决方案2】:

      您想做到多彻底取决于您自己。我会对每个正确的转换进行测试,例如

      [Test]
      public void ChangeStatus_FirstToSecond_Succeeds()
      {
           Entity entity = new Entity(StatusEnum.First);
           entity.ChangeStatus(StatusEnum.Second);
           Assert.That(entity.Status, Is.EqualTo(StatusEnum.Second);
      }
      

      并测试每个输入状态的一个无效转换:

      [Test]
      [ExpectedException(typeof(StatusChangeException))]
      public void ChangeStatus_FirstToTenth_ThrowsException()
      {
           Entity entity = new Entity(StatusEnum.First);
           entity.ChangeStatus(StatusEnum.Tenth);
      }
      

      【讨论】:

      • 是的,也许只用一个引发异常的测试来检查是否抛出异常就足够了,在这种情况下,可能会允许错误的转换。
      猜你喜欢
      • 2020-06-10
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多