2013-02-21 117 views
1

我正在开发的其中一个项目是一个键盘钩子,它可以捕捉一些编号较高的功能按钮(f13-f20)。这个平板电脑可以工作,它上面有一些按钮,它们被映射到那些高级功能按钮上。因此,任何我正在创建一个具有其构造函数的类的用户都可以输入Key(来自System.Windows.Forms.Keys)和AbstractTask。由于使用钩子将执行各种任务,因此我决定这将是一种光滑的做法。其中一个任务是KeyboardTask。超级简单的类(我希望ATLEAST)虚拟键盘的单元测试

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。我更喜欢使用NUnit的作为似乎是VS测试套件不精制(althoough将是一个十亿倍conveniant如果它的工作)

+0

HA ..想通了..超级简单了。基本上我做了一个带有文本框的表单。添加了一个keydown监听器。在KeyDown上,我将一个名为PressedKey的字段设置为e.KeyData,然后将对话结果设置为OK。我会在可以的时候显示代码。 – 2013-02-21 19:02:55

回答

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; 
} 

工程就像一个魅力。