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# ゲーム プログラミング: 真剣なゲーム作成のために」という書籍からのものです。

この本の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 はテスト プロジェクト アセンブリの名前に変更されます)

単体テスト プロジェクトの参照を右クリックして、テストしているプロジェクトへの参照を追加します。

これは、2 つのプロジェクトを緊密に結合し、通常のオブジェクト指向のベスト プラクティスに反するため、単体テストにのみ推奨されます。

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

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

クラス メンバーはデフォルトでプライベートであり、コンストラクターもプライベートです。その結果、テスト コードからアクセスできなくなります。クラス自体以外からアクセスしたい場合は、コンストラクターを public にします。

于 2012-04-21T20:20:21.757 に答える