2
//Page 40: Unit Test for Player class
//Player must have a health that is greater than 0
//When the character is created.

namespace UnitTestingSample
{

    class PlayerTests
    {
        public bool TestPlayerIsAliveWhenBorn()
        {
            Player p = new Player(); //ERROR: 'UnitTestingSample.Player.Player()' is inaccessible due to its protection level

            if (p.Health > 0)
            {
                return true; //pass test
            }

            return false; //fail test

        }//end function

    }//end class

}//end namespace

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//Page 41
//Player class has default health which is 10
//when his character is created
namespace UnitTestingSample
{

    class Player
    {
        public int Health { get; set; }

        Player() //constructor
        {
            Health = 10;
        }
    }
}

================

你看,这就是让我难过的地方。

此代码来自名为“C# Game Programming: For Serious Game Creation”的书。

我从本书的 CD-ROM 中得到了完全相同的代码。该示例代码很好,而我的有错误。

这是我第一次使用 C# 编写游戏编码。但是,据我了解,我的应该可以工作。但是,看起来编译器不这么认为。

我怎样才能解决这个问题?

4

2 回答 2

4

我有一个类似的问题,发现这篇博客文章很有帮助 http://softwareonastring.com/316/why-cant-my-test-access-a-public-constructor

它建议的具体解决方案是将以下行添加到您要测试 AssemblyInfo.cs 文件的项目中

[assembly: InternalsVisibleTo("TestProject")]

(其中TestProject更改为您的测试项目程序集的名称)

以及右键单击单元测试项目中的引用并添加对您正在测试的项目的引用。

这仅推荐用于单元测试,因为它将两个项目紧密耦合在一起,并且会违背正常的面向对象的最佳实践。

于 2016-01-01T21:00:58.747 回答
3
class Player
{
    public int Health { get; set; }

    public Player() //constructor
    {
        Health = 10;
    }
}

默认情况下,类成员是私有的,您的构造函数也是如此 - 这导致您的测试代码无法访问。如果您想从类本身以外的其他地方访问它,请将构造函数设为公开。

于 2012-04-21T20:20:21.757 回答