C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: WinUnitで対象クラスのprivateメン


(過去ログ 32 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■15517 / inTopicNo.1)  WinUnitで対象クラスのprivateメンバーを使いたい
  
□投稿者/ PATIO (37回)-(2008/03/14(Fri) 13:52:40)

分類:[C/C++] 

ども、いつもお世話になってます。PATIOです。

CppUnitの時は小細工で何とかしていた問題に表題にある
テスト対象のprivateメンバーにアクセスしたいと言う話があります。
これができないとメンバー変数のゲッター・セッターのテスト等で
卵が先か鶏が先かの問題が起こってしまいます。

CppUnitの時はテストクラスを対象クラスのFriendクラスにすることで
回避していたんですが、今回のWinUnitはクラスを使っていないので
その手は使えないみたいです。
Friend関数を指定すればと思ったんですが、extern "C"がついている所為か
friend関数宣言時に以下のようなエラーが出てしまいます。
どうもextern "C"がある為にうまく通っていないような感じです。

error C2059: 構文エラー : '文字列'
error C2238: ';' の前に無効なトークンがあります。

関数宣言その物が無効になっている模様です。

やり方が悪いのかなぁ
こんな感じで書いてますけれど。

friend extern "C" bool TEST_CounterConstructTest(wchar_t*, size_t);

何か回避方法はあるんでしょうか。

引用返信 編集キー/
■15518 / inTopicNo.2)  Re[1]: WinUnitで対象クラスのprivateメンバーを使いたい
□投稿者/ επιστημη (870回)-(2008/03/14(Fri) 14:09:56)
επιστημη さんの Web サイト
2008/03/14(Fri) 14:11:36 編集(投稿者)
> CppUnitの時はテストクラスを対象クラスのFriendクラスにすることで
> 回避していたんですが、今回のWinUnitはクラスを使っていないので
> その手は使えないみたいです。

小賢しくもクラスの皮を一枚被せる (^^;

#include "WinUnit.h"

// コレがテスト対象。
class Target {
friend class Tester;
private:
  int value;
public:
  Target(int v) : value(v) {}
};

// private部に風穴をあけるクラス
// public static なテストをここに書く
class Tester {
public:
static void good() {
  Target t(3);
  WIN_ASSERT_EQUAL(3, t.value);
}
static void bad() {
  Target t(3);
  WIN_ASSERT_EQUAL(4, t.value);
}
};

// WinUnitのエントリ。横流しにすっだけ。
BEGIN_TEST(MyFailingTest)
{ Tester::bad(); }
END_TEST

BEGIN_TEST(MySucceedingTest)
{ Tester::good(); }
END_TEST

引用返信 編集キー/
■15522 / inTopicNo.3)  Re[2]: WinUnitで対象クラスのprivateメンバーを使いたい
□投稿者/ επιστημη (871回)-(2008/03/14(Fri) 14:51:40)
επιστημη さんの Web サイト
悪フザケ♪

#include "WinUnit.h"

class Target {
friend struct Tester; // struct Tester には見せてやる
private:
  int value;
public:
  Target(int v) : value(v) {}
};

struct Tester {

  // static void XXX() でテストを書く
  static void bad() {
    Target t(3);
    WIN_ASSERT_EQUAL(4, t.value);
  }

  static void good() {
    Target t(3);
    WIN_ASSERT_EQUAL(3, t.value);
  }

};

/* フザケた おまぢない */
#define TEST_CLASS_METHOD_(CLASS,UC,METHOD) BEGIN_TEST(CLASS##UC##METHOD) { CLASS::METHOD(); } END_TEST
#define TEST_CLASS_METHOD(CLASS,METHOD) TEST_CLASS_METHOD_(CLASS,_,METHOD)

/* Tester::good と Tester::bad をテスト汁! */
TEST_CLASS_METHOD(Tester,good);
TEST_CLASS_METHOD(Tester,bad);

引用返信 編集キー/
■15523 / inTopicNo.4)  Re[2]: WinUnitで対象クラスのprivateメンバーを使いたい
□投稿者/ PATIO (38回)-(2008/03/14(Fri) 15:23:38)
No15518 (επιστημη さん) に返信
> 小賢しくもクラスの皮を一枚被せる (^^;
>
> #include "WinUnit.h"
>
> // コレがテスト対象。
> class Target {
> friend class Tester;
> private:
> int value;
> public:
> Target(int v) : value(v) {}
> };
>
> // private部に風穴をあけるクラス
> // public static なテストをここに書く
> class Tester {
> public:
> static void good() {
> Target t(3);
> WIN_ASSERT_EQUAL(3, t.value);
> }
> static void bad() {
> Target t(3);
> WIN_ASSERT_EQUAL(4, t.value);
> }
> };
>
> // WinUnitのエントリ。横流しにすっだけ。
> BEGIN_TEST(MyFailingTest)
> { Tester::bad(); }
> END_TEST
>
> BEGIN_TEST(MySucceedingTest)
> { Tester::good(); }
> END_TEST

そうか、BEGIN_TESTの方でクラスメソッドを呼べば言いだけの話ですね。
この辺うまく改良できると行けそうな感じです。
自分のケースで試して見ます。

引用返信 編集キー/
■15526 / inTopicNo.5)  Re[3]: WinUnitで対象クラスのprivateメンバーを使いたい
□投稿者/ PATIO (39回)-(2008/03/14(Fri) 15:58:57)
> /* フザケた おまぢない */
> #define TEST_CLASS_METHOD_(CLASS,UC,METHOD) BEGIN_TEST(CLASS##UC##METHOD) { CLASS::METHOD(); } END_TEST
> #define TEST_CLASS_METHOD(CLASS,METHOD) TEST_CLASS_METHOD_(CLASS,_,METHOD)

いいですねー、これ。
他の人に説明する時にこれの方が説明しやすそうです。
このマクロでテスト対象にしますとか、言っとけばいいわけで。
問題はクリアできたので導入資料でも作成してみようかと思います。
うまくやれば、CppUnitよりも楽に出来そうです。

引用返信 編集キー/
■15530 / inTopicNo.6)  Re[4]: WinUnitで対象クラスのprivateメンバーを使いたい
□投稿者/ επιστημη (872回)-(2008/03/14(Fri) 16:50:39)
επιστημη さんの Web サイト
>>/* フザケた おまぢない */
>>...
> いいですねー、これ。
> 他の人に説明する時にこれの方が説明しやすそうです。
> このマクロでテスト対象にしますとか、言っとけばいいわけで。

てへへー ^^;

> 問題はクリアできたので導入資料でも作成してみようかと思います。
> うまくやれば、CppUnitよりも楽に出来そうです。

お役に立ててなにより。
Fixtureも一緒宣言/定義できそうです。

struct Tester {

  // static void Setup/Teardown() を書く
  static void Setup() { ... }
  static void Teardown() { ... }

  // static void XXX() でテストを書く
  static void bad() {
    Target t(3);
    WIN_ASSERT_EQUAL(4, t.value);
  }

  static void good() {
    Target t(3);
    WIN_ASSERT_EQUAL(3, t.value);
  }

};

FIXTURE(Tester);
TEST_FIXTURE_METHOD(Tester,good);
TEST_FIXTURE_METHOD(Tester,bad);

なんてな。
# できたらください♪


引用返信 編集キー/
■15534 / inTopicNo.7)  Re[5]: WinUnitで対象クラスのprivateメン
□投稿者/ PATIO (40回)-(2008/03/14(Fri) 17:47:48)
2008/03/14(Fri) 17:48:45 編集(投稿者)

No15530 (επιστημη さん) に返信
> struct Tester {

ちなみにですが、ここのところがstruct宣言になっているのは
何か意味があるんでしょうか?
classでも良い気がするんだけど。

static関数ばかりで仮想関数がないから?

引用返信 編集キー/
■15536 / inTopicNo.8)  Re[6]: WinUnitで対象クラスのprivateメン
□投稿者/ 774RR (140回)-(2008/03/14(Fri) 18:13:46)
全部 public にするから・したいから、でっしゃろ
引用返信 編集キー/
■15542 / inTopicNo.9)  Re[7]: WinUnitで対象クラスのprivateメン
□投稿者/ επιστημη (873回)-(2008/03/14(Fri) 19:43:31)
επιστημη さんの Web サイト
> 全部 public にするから・したいから、でっしゃろ

でおます。 public: の7文字を削りたいがためだけに (^^;

引用返信 編集キー/
■15543 / inTopicNo.10)  Re[8]: WinUnitで対象クラスのprivateメン
□投稿者/ a (1回)-(2008/03/14(Fri) 19:56:39)
> 全部 public にするから・したいから、でっしゃろ

でおます。 public: の7文字を削りたいがためだけに (^^;


解決済み
引用返信 編集キー/
■15545 / inTopicNo.11)  Re[9]: WinUnitで対象クラスのprivateメン
□投稿者/ 出水 (8回)-(2008/03/14(Fri) 20:54:08)
#define private public

こんなおまじないは如何?
引用返信 編集キー/
■15552 / inTopicNo.12)  Re[10]: WinUnitで対象クラスのprivateメン
□投稿者/ 出水 (10回)-(2008/03/14(Fri) 21:56:45)
すいません、解決済みマーク消しちゃいました…
解決済み
引用返信 編集キー/
■15554 / inTopicNo.13)  Re[10]: WinUnitで対象クラスのprivateメン
□投稿者/ επιστημη (874回)-(2008/03/14(Fri) 22:57:30)
επιστημη さんの Web サイト
> #define private public
> こんなおまじないは如何?

#ifdef _DEBUG
#define private public
#endif

たまぁにやります♪

解決済み
引用返信 編集キー/
■15560 / inTopicNo.14)  Re[11]: WinUnitで対象クラスのprivateメン
□投稿者/ PATIO (1回)-(2008/03/15(Sat) 14:43:19)
>> 全部 public にするから・したいから、でっしゃろ
>
> でおます。 public: の7文字を削りたいがためだけに (^^;

なるほど、納得しました。

No15554 (επιστημη さん) に返信
>>#define private public
>>こんなおまじないは如何?
>
> #ifdef _DEBUG
> #define private public
> #endif
>
> たまぁにやります♪

これも考えたんですが、何となくprivateをpublicにするのは気が引けまして。(^^;
じゃあ、friendはいいのかという話になりますが、気持ちの問題といいますか。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -