質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

3回答

2774閲覧

ボタンクリックイベントのテストを作るときに、senderとeのを渡したい

meshkit

総合スコア72

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/03/23 01:19

前提・実現したいこと

Visual Studio 2015 ProとMSTestでテストを作っています。
ボタンクリックイベントのテストを作るときに、senderとeの渡し方で困っています。
どうすれば、OnStartButtonClickを呼んで値を渡せますか?

該当のソースコード

C#

1MainForm 2 private void OnStartButtonClick(object sender, EventArgs e) 3 { 4 //処理 5 }

C#

1TestCode 2 private static bool CheckStart() 3 { 4 var mainform = new MainForm(); 5 var privateObject = new PrivateObject(mainform); 6 privateObject.Invoke(new Action<string>(OnStartButtonClick), new object[] { mainform, EventArgs.Empty }); 7 }

エラーメッセージ

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー CS0103 現在のコンテキストに 'OnStartButtonClick' という名前は存在しません。 164 アクティブ

補足情報(FW/ツールのバージョンなど)

Visual Studio 2015 Pro
MSTest

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

未検証ですが

C#

1privateObject.Invoke("OnStartButtonClick", new object[] { mainform, EventArgs.Empty });

投稿2018/03/23 01:57

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meshkit

2018/03/23 02:16

ありがとうございます。 型 'System.MissingMethodException' の例外が mscorlib.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした 追加情報:見つからないメンバーにアクセスしようとしました。 でした。
Zuishin

2018/03/23 02:28

テストプロジェクトの MainForm は確かにテストしたい MainForm ですか? new MainForm() の MainForm を選択して Ctrl+F12 で確かめてください。 また OnStartButtonClick の綴りが正しいことを保証するためにテストプロジェクトに手写しでなくコピペしてください。
meshkit

2018/03/23 02:38

はいmainformですし、copy & pasteしています。
Zuishin

2018/03/23 02:47

こちらでは同様にしてテストできました。 もう一度聞きますが、Ctrl+F12 でどうなりました?
meshkit

2018/03/23 02:51

ありがとうございます。ちゃんとそのMainFormのコンストラクに飛びます。 うーむ。
Zuishin

2018/03/23 02:53

現時点でのソースを挙げてみてください。
meshkit

2018/03/23 04:09

//privateObject.Invoke(new Action<string>(OnStartButtonClick), new object[] { mainform, EventArgs.Empty }); //privateObject.Invoke("OnStartButtonClick"); //privateObject.Invoke("OnStartButtonClick", new object[] { mainform, EventArgs.Empty }); privateObject.Invoke("OnStartButtonClick", new object[] { null, EventArgs.Empty }); です。全滅。
Zuishin

2018/03/23 04:11

ここではなく、質問を編集して MainForm とテストプロジェクトの現時点でのソースを追記してください。 断片的に見せられてもわかりません。 私のところでは動いているので、間違っているのは今挙げられている断片ではなく挙げられていないところです。
guest

0

senderとeを渡す方法ではありませんが
Button.PerformClickメソッドでやりたいことは実現できませんか?

投稿2018/03/23 03:53

Rocky

総合スコア261

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meshkit

2018/03/23 04:15

なるほど。 早速。 var button = privateObject.GetField("OnStartButtonClick") as Button; button.PerformClick(); ダメでした。
meshkit

2018/03/23 04:33

var button = privateObject.GetField("StartButton") as Button; button.PerformClick(); 型 'System.MissingFieldException' の例外が mscorlib.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした 追加情報: 見つからないメンバーにアクセスしようとしました。 でした。
g_uo

2018/03/23 05:50

横から失礼します。 1) ButtonのあるMainFormのデザイナコードを開いて、StartButtonを"private"から"public"に変更 2) mainForm.StartButton.PerformClick() 乱暴なやり方ですが、これではだめでしょうか?
guest

0

・そもそもprivateなんだから参照できないって話なんじゃね(エラーメッセージもそう言ってるような)
・InvokeのなかのActionの記述も実体とはあってないんじゃ(なんで引数がstringだけなんだ?)

投稿2018/03/23 03:05

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/03/23 03:14

private を参照するための PrivateObject ですからできます。 Action の記述は確かに違いますので文字列の引数を提案しました。
y_waiwai

2018/03/23 03:24

そなんですか。MSTest ってのがよーわからんし、Zuishinさんが指摘してないのでなんかあるんだろーとは思ってましたが。ご教示ありがとうございます
Zuishin

2018/03/23 03:31

MSTest は Visual Studio 内蔵のテストサービスです。 メインメニューに「テスト」というのがあると思いますが、そこやコンテクストメニューからテストプロジェクトを作ったりテストしたりできます。 PrivateObject や PrivateType はテストプロジェクトからデフォルトで参照されるアセンブリで実装されていて、プライベートメンバーをテストするためのクラスです。
y_waiwai

2018/03/23 03:32

ああ、なら件のエラーメッセージは stringを一つ引数にもつOnStartButtonClickは無い、って意味なのか。 なるほど この回答はピント外れのようなのでマイナスで沈めておいてくださいませ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問