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

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

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

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

Q&A

解決済

1回答

7610閲覧

イベントの発生が起こっているかテストしたい

kazuya_

総合スコア78

C#

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

0グッド

1クリップ

投稿2017/06/02 02:43

OnPageEvenを定義して、実際に発生できるか単体テストできるでしょうか?
テスト対象のTriggerActionを作成する方法がありましたが、WPF用で使用できませんでした。(後部コード)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.UI.WebControls; namespace UnitEveTest { class Program { static void Main(string[] args) { } } public class User { public delegate void PageEventHandler(object sender, PageEventArgs e); public event PageEventHandler PageEvent; public User() { } public void OnPageEvent(PageEventArgs e) { PageEvent?.Invoke(this, e); } //下記でイベント発生が起こるかテストしたい 例) public void OnPageEvent1() { User user; user = new User(); this.OnPageEvent((PageEventArgs)null); } } } //******************************************************************************************** //下記にWPFでのメソッドを使用した例がありましたが、DelegeteCommandがWPF用のようで使用できません。 [TestMethod] public void TestMethod1() { // 1.検証用の変数を用意する var actual = false; // 2.テスト対象のTriggerActionを作成する var targetAction = new InvokeCommandAction(); // 3.TriggerActionにCommandを設定する。Commandが呼ばれた場合はactualがtrueになる targetAction.Command = new DelegateCommand(() => actual = true); // 4.イベントを発生させるコントロールを作成する。 var eventSource = new Button(); // 5.EventTriggerを作成する。 var trigger = new System.Windows.Interactivity.EventTrigger("Click"); // 6.EventTriggerにテスト対象のTriggerActionを追加する。 trigger.Actions.Add(targetAction); // 7.EventTriggerをボタンコントロールにアタッチさせ、SourceObjectを設定する。 trigger.Attach(eventSource); trigger.SourceObject = eventSource; // 8.ボタンのクリックイベントを発生させる eventSource.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); // trueならば、Commandは呼ばれている Assert.IsTrue(actual); }

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

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

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

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

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

ebiryo

2017/06/02 03:18

動作環境、開発環境くらい書いたほうが良いと思います
kazuya_

2017/06/02 09:45

VS2015のコンソールアプリです。
ebiryo

2017/06/02 09:55

コンソールアプリなのにボタンクリックのイベントのテストをしたいのですか?
kazuya_

2017/06/03 10:20

例はコンソールですが、Formは作成するつもりです。
guest

回答1

0

ベストアンサー

単体テストできるかとおっしゃっているのは、
テストコードが書けるか?という意味でしょうか。

↓こんなのでどうでしょうか。

C#

1var user = new User(); 2 3var called = false; 4 5user.PageEvent += (s, e) => 6{ 7 //イベントハンドラの中でtrueに 8 called = true; 9}; 10 11user.OnPageEvent1(); 12 13//trueになったことを確認 14Assert.That(called, Is.True); 15

投稿2017/06/03 05:54

oika

総合スコア425

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

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

kazuya_

2017/06/03 10:18

ありがとうございます。大体、趣旨にはあっているのですが、PageEvent?.Invoke(this, e);で PageEventがある場合、invoke(this,e)できるでしょうか? (このthisは何かよくわかりません)
oika

2017/06/04 04:57 編集

>PageEvent?.Invoke(this, e);で >PageEventがある場合、invoke(this,e)できるでしょうか? PageEventにイベントハンドラが登録されているときに「PageEvent?.Invoke(this, e);」でイベントを発生させられるかという意味でしたら、yesです。 ↑のコードは「 if (PageEvent != null) PageEvent.Invoke(this, e);」と書くのとほぼ同じです。 >(このthisは何かよくわかりません) イベントハンドラは引数に「(object sender, xxxEventArgs e)」をとる形にするのが慣例となっており、 この第一引数のsenderには、イベントの発生元であるオブジェクトが入ります。 今回の場合、PageEventの発生元はUserオブジェクトですので、 自分自身のオブジェクトを設定するために「this」となります (大抵こうなります)。 ついでに気になった点ですが、 「OnPageEvent1」の最初の2行 >User user; >user = new User(); ご提示のコードを見る限りでは、↑はまるで必要がないようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問