如何测试函数是否不抛出异常?

时间:2016-03-03 11:41:35

标签: c# unit-testing exception nunit nsubstitute

我有这个功能和测试:

public void SaveForWeb ()
{
    UpdateGameState();
    try
    {
        PlayerPrefs.SetFloat(Helper.EXP_KEY, experience);
        PlayerPrefs.SetFloat(Helper.SCORE_KEY, score);
        // other properties that need to be saved in PlayerPrefs

        PlayerPrefs.Save();
    }
    catch (Exception ex)
    {
        Debug.Log(ex.Message);
    }
}

[Test]
[Category(Helper.TEST_CATEGORY_SAVE_FOR_WEB)]
public void SaveForWebTest ()
{
    // arrange
    var slgdController = FakeSaveLoadGameDataController();
    TestDelegate myDelegate = () => {};

    // act
    slgdController.SaveForWeb();

    // assert
    Assert.DoesNotThrow(myDelegate);
}

但我觉得断言和SaveForWeb()函数的调用之间没有联系。

注意:SaveForWeb()使用Unity3D API中的PlayerPrefs,如果本地文件超过1 MB,则可能抛出PlayerPrefsException。

如果函数没有抛出异常,这是断言的正确方法吗?

5 个答案:

答案 0 :(得分:7)

如果方法不抛出,你不必断言。我知道你正在使用NUnit,但是xUnit issue描述了你为什么不需要断言它。

但是,如果你想要明确,你可以这样做:

[Test]
[Category(Helper.TEST_CATEGORY_SAVE_FOR_WEB)]
public void SaveForWebTest ()
{
    // arrange
    var slgdController = FakeSaveLoadGameDataController();

    Assert.DoesNotThrow(() => slgdController.SaveForWeb());
}

答案 1 :(得分:4)

如果它没有抛出异常,那么代码应该只是工作并到达测试方法的末尾。因此,您可以在结尾处添加Assert.IsTrue(true),只有如果方法运行时没有任何错误。否则(如果发生异常),测试将立即停止并返回false。

编辑:您甚至不需要拨打Assert.IsTrue,如果测试结束,测试也会成功。

答案 2 :(得分:3)

在我的测试中,我只是没有断言。如果抛出异常,则测试将失败,因为您没有ExpectedException属性。

Assert.IsTrue(true)毫无意义imho

答案 3 :(得分:2)

正如其他人所说,单元测试会自动失败。但是,如果你真的想为此尝试写一个断言,那就试试这个。

bool pBDoIntersect;

 foreach (Control picturebox in this.Controls)
        {
            if (PB.Bounds.IntersectsWith(picturebox.Bounds))
            {
                pBDoIntersect=true;
            }
        }

if(!pBDoIntersect)this.Controls.Add(PB);

答案 4 :(得分:1)

你应该给你的单元测试更有意义的名字。这样,您可以从测试中真正理解出现了什么问题:

    [TestMethod]
    public void SaveForWeb_WhenGameControllerIsOk_DoesNotThrowException()
    {
        // Arrange
        var controller = FakeSaveLoadGameDataController();

        // Act
        controller.SaveForWeb();

        // Assert - Will fail by exceptionThrown
    }

    [TestMethod, ExpectedException(typeof(ReallyBadException))]
    public void SaveForWeb_WhenGameControllerThrowsException_ThrowsException()
    {
        // Arrange
        var controller = new FakeSaveLoadGameDataControllerWithException();

        // Act
        controller.SaveForWeb();
    }