我有这个功能和测试:
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。
如果函数没有抛出异常,这是断言的正确方法吗?
答案 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();
}