代码之家  ›  专栏  ›  技术社区  ›  Sherlock

如何对后台工作人员C进行单元测试#

  •  4
  • Sherlock  · 技术社区  · 15 年前

    我正在尝试单元测试,使用vs单元测试工具遵循方法。

    void Get(string name, Action<string> callBack);
    

    这是单元测试仪

        [TestMethod]
        public void Test()
        {
            Action<string> cb = name =>
            {
                Assert.IsNotNull(name);
            };
    
            var d = new MyClass();
            d.Get("test", cb);
        }
    

    唯一的问题是内部实现使用BackgroundWorker,因此在另一个线程上调用回调。这是内部实现。

        public void Get(string name, Action<string> callBack)
        {
            callBackString = callBack;
            GetData(name);
        }  
    
        private void GetData(string name)
        {
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += bw_DoWork;
            bw.RunWorkerCompleted += bw_RunWorkerCompleted;
            bw.RunWorkerAsync(name);
        }
    
        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //do work here
            if (null != callBackString)
                callBackString("ok");
        }
    

    当然,因为get()立即返回,所以测试成功完成,测试停止,因此RunWorkerCompleted永远不会被执行。我可以通过普通应用程序(WPF)轻松地测试它,因为它保持运行,但是我希望能够对其进行单元测试。

    有什么想法吗? 事先谢谢。

    3 回复  |  直到 15 年前
        1
  •  7
  •   Martin Harris    15 年前

    类似:

    [TestMethod]
    public void Test()
    {   
        bool running = true;
        string result = null;
    
        Action<string> cb = name =>
        {
            result = name;
            running = false;
        };
    
        var d = new MyClass();
        d.Get("test", cb);
    
        while(running)
        {
            Thread.Sleep(100);
        }
    
        Assert.IsNotNull(result);
    }
    

    尽管您可能希望在其中添加一些东西,以阻止测试在失败时永远运行…

        2
  •  4
  •   Michael Lloyd Lee mlk    15 年前

    我不知道C&BackgroundWorker的详细信息,但我会通过注入BackgroundWorker实现来实现这一点,并且在测试期间使用一个存根的BackgroundWorker,您可以控制它何时执行以及在哪个线程中执行。如果需要两个线程之间的通信,那么让存根后台工作人员创建一个新线程,并让测试暂停直到完成,如果不强制它在调用get之后运行。

        3
  •  0
  •   TrueWill    15 年前

    我已经编写了类似的代码,并通过遵循 IAsyncResult design pattern . 我的单元测试是针对方法的同步(阻塞)版本运行的。异步方法可以是每一行,所以我没有针对这些方法编写单元测试。