测试状态更改规则

时间:2011-02-04 09:46:21

标签: .net unit-testing testing nunit

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

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

2 个答案:

答案 0 :(得分:2)

> 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)

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

答案 1 :(得分:1)

你想要多么彻底取决于你。我会对每个正确的转换进行测试,例如

[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);
}