您好,我目前正在编写一个小而简单的单元测试,我似乎无论做什么都会让测试失败。
我有一个简单的MainMenuActions类,它可以更改面板的Active状态,如下所示:
public class MainMenuActions : MonoBehaviour {
public GameObject panelMainMenu = new GameObject("Panel");
public void singlePlayerPressedFromMainMenu()
{
panelMainMenu.SetActive(false);
}
}
函数singlePlayerPressedFromMainMenu()在单位按钮上设置,以更改面板的活动状态。
在我的单元测试中,我有以下内容:
using UnityEngine;
using UnityEditor;
using NUnit.Framework;
public class MainMenuTests {
[Test]
public void ClickingSinglePlayer_HidePanel_PanelHides()
{
//Arrange
var menu = new MainMenuActions();
//Act
menu.singlePlayerPressedFromMainMenu();
//Assert
menu.panelMainMenu.activeSelf.ToString().Equals("True");
}
}
此测试通过,但假设失败。在调试时我发现activeSelf确实被设置为false但仍然是我的测试通过。我错过了什么?
答案 0 :(得分:3)
您似乎以错误的方式使用了NUnit。你忘了使用Assertion
吗?以下是https://www.codeproject.com/Articles/3781/Test-Driven-Development-in-NET的示例测试用例:
namespace UnitTestingExamples
{
using System;
using NUnit.Framework;
[TestFixture]
public class SomeTests
{
[Test]
public void TestOne()
{
int i = 4;
Assertion.AssertEquals( 4, i );
}
}
}
请注意,它正在使用Assertion
。如果一个测试失败,则会触发断言。
这可能是你的一个简单错误,但我会解释为什么这对于其他读者来说更多细节上没有做任何事情。
在您的代码中,menu.panelMainMenu.activeSelf.ToString().Equals("True");
将返回false
。但是没有人关心这个返回值,因为它没有被任何人消费。换句话说,您只是跳过以下行的左侧:
void MyCompilerIsHappy
{
bool myBool = menu.panelMainMenu.activeSelf.ToString().Equals("True");
menu.panelMainMenu.activeSelf.ToString().Equals("True");
}
如果你错过LHS会发生什么,它将返回“假”或“真”,无论它是什么,但它的返回值根本不被使用。当不消耗方法的返回值时,编译器不会抱怨。但是,如果您这样做,它会抱怨:
void MyCompilerIsNotHappy
{
true;
false;
5;
"some string here";
}
当方法的返回值未被使用时编译器不会抱怨的原因是这样的方法可能具有可能改变应用程序状态的业务逻辑,并且在某些情况下不需要使用这样的返回值和程序员故意选择不使用。
以下是一些单元测试教程:
http://www.nunit.org/index.php?p=quickStart&r=2.4
https://www.codeproject.com/Articles/3781/Test-Driven-Development-in-NET