2017-04-14 199 views
0

您好,我现在正在编写一个小而简单的统一单元测试,我似乎可以让测试失败,无论我做什么。Unity3d单元测试问题

我有一个简单MainMenuActions类,其改变面板的激活状态,它看起来像这样:

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

http://www.4guysfromrolla.com/articles/011905-1.aspx

+0

感谢您的回复,此工作Assert.AreEqual(menu.panelMainMenu.activeSelf,false); – arjwolf

+0

我很高兴它帮助! – BrokenBacon