1

私が開発している私のプロジェクトの 1 つは、より大きな番号の機能ボタン (f13-f20) のいくつかをトラップするキーボード フックです。これが動作するタブレットには、それらの高機能ボタンにマッピングされたボタンがあります。そのため、コンストラクターとして Key (System.Windows.Forms.Keys から) と AbstractTask を入力するクラスを作成している人は誰でも。use フックはさまざまなタスクを実行するため、これは巧妙な方法であると判断しました。タスクの 1 つに KeyboardTask があります。超単純なクラス(少なくとも願っています)

public class KeyboardTask : AbstractTask
{
    private KeyboardTask ()
    { }
    public KeyboardTask (KeyboardCommand key)
    {
        Options = "{" + key + "}";
    }
    public override void PerformTask()
    {
        Globals.WriteLog("KeyboardTask:PerformTask()+");
        try
        {
            System.Windows.Forms.SendKeys.Send(Options);
        }
        catch (System.Exception ex)
        {
            Globals.WriteExceptionLog(ex);
        }
        Globals.WriteLog("KeyboardTask:PerformTask()-");
    }
}
public enum KeyboardCommand
{
    BACKSPACE,//{BACKSPACE}, {BS}, or {BKSP}
    BREAK,//{BREAK}
    CAPSLOCK,//{CAPSLOCK}
    DELETE,//{DELETE} or {DEL}
    DOWN, //{DOWN}
    END,//{END}
    ENTER,//{ENTER}or ~
    ESC,//{ESC}
    //etc
}

非単体テストとして、これを追加してプログラムをコンパイルしました

        ksel1 = new KeyboardSystemEventListener((Keys.F13), new KeyboardTask(KeyboardCommand.F1));//F1
        ksel6 = new KeyboardSystemEventListener((Keys.F18), new ECTask(EmbeddedControllerCommand.DecreaseBackLight));//RB

(この方法で行う大きなバグがありますが、それは既に解決されており、実装する必要があります) プログラムをタブレットに置き、IE を開き、F13 ボタンを押すと IE のヘルプが開きました (YEAH!) .. F18 を押すと、バックライトが減少しました.. (大きな驚きはありません)

それで、私は考え始めました..もっと良い方法が必要です(私が言うべきだったのは、なぜ最初に単体テストを書かなかったのかということです)それで私は単体テストを書き始めました..問題は私が「F13キーはありません。大したことではありません。キーボードのホームボタンと言うように変更しますが、F1を確認しようとしましたが、ユニットテストでそれを行う方法がわからないことに気付きました. 私が見たいのは、代わりにこのようなものです(私を方程式から外してください)

    [Test]
    public void TestKeyboardTask()
    {
        KeyboardTask kkt = new KeyboardTask(KeyboardCommand.F1);
        kkt.PerformTask();

        Assert.IsTrue(/*F1 key was pressed*/false);
    }

何か案は?NUnit 2.6.2 と Visual studio 2012 pro を使用しています。VSテストスイートは洗練されていないように見えるため、NUnitを使用することを好みます(ただし、機能した場合は10億倍便利になります)

4

1 に答える 1

1

テストクラス

    [Test]
    public void TestKeyboardTask()
    {
        KeyboardTask kkt = new KeyboardTask(KeyboardCommand.F1);
        using (MockKeyboardTest f = new MockKeyboardTest())
        {
            f.ShowDialog(kkt);
            Assert.AreEqual(Keys.F1, f.PressedKey);
        }
    }

模擬キーボード テスト

class MockKeyboardTest : Form
{
    public MockKeyboardTest()
    {
        InitializeComponent();
        PressedKey = Keys.BrowserBack;
    }
    public void ShowDialog(KeyboardTask kkt)
    {
        Keyboard = kkt;
        base.ShowDialog();

    }
    public void InitializeComponent()
    {
        this.Shown += MockKeyboardTest_Shown;
        KeyboardTestTextbox.AcceptsTab = true;
        KeyboardTestTextbox.Location = new Point(2, 22);
        KeyboardTestTextbox.MaxLength = 50;
        KeyboardTestTextbox.Multiline = true;
        KeyboardTestTextbox.Size = new Size(195, 25);
        KeyboardTestTextbox.KeyDown += this.KeyboardTestTextbox_KeyDown;

        Controls.Add(KeyboardTestTextbox);
    }

    void MockKeyboardTest_Shown(object sender, System.EventArgs e)
    {
        Keyboard.PerformTask();
    }

    private void KeyboardTestTextbox_KeyDown(object sender, KeyEventArgs e)
    {
        PressedKey = e.KeyData;
        this.DialogResult = DialogResult.OK;
    }
    private TextBox KeyboardTestTextbox = new TextBox();
    private KeyboardTask Keyboard;
    public Keys PressedKey;
}

魅力のように機能します。

于 2013-02-21T19:05:04.923 に答える