2010-10-13 40 views
0

我最近登上了Pex &鼴鼠的行列,以便測試一些邏輯,其中包含許多靜態,非虛擬,密封等元素。最近,我已經開始看到我無法從一些測試。爲什麼在單獨運行時使用HostType(「Moles」)進行單元測試時斷言,但在運行一組測試時失敗?

接口的兩個方法存根返回void,因此我將存根設置爲更新布爾變量的委託以表示它們已被調用。以下是我在做什麼:

[TestMethod] 
[HostType("Moles")] 
    public void UnitTestX() 
    { 
     bool disposeCalled = false; 
     bool getCalled = false; 

     ClassX classX = new ClassX(); 
     var data = new SIClassXData 
         { 
          Dispose =() => disposeCalled = true, 
          Get =() => getCalled = true, 
          ClassXGet =() => classX 
         }; 

     MDataLayerFactory.CreateDataLayerObject(() => (IClassXData)data); 

     Assert.IsTrue(disposeCalled); 
     Assert.IsTrue(getCalled); 
    } 

無論出於何種原因,如果我單獨運行這個測試,斷言會成功。但是,如果我在程序集中運行測試以及其他所有測試(使用Visual Studio的「在解決方案中運行所有測試」功能),則第一個斷言失敗。

我想知道爲什麼發生這種情況,以及我需要更改以解決問題。

+0

DataLayerFactory是一個有狀態的服務嗎?在這種情況下,測試用例可能會導致系統處於失敗狀態 - 但不會孤立地失敗。 – Peli 2010-10-15 03:29:23

+0

@PeliLayerFactory是一個靜態類,沒有任何東西可以保持狀態。 – 2010-10-15 14:54:00

+0

僅供參考 - 一般來說,我們不會積極跟蹤Pex/Moles上的stackoverflow問題/答案(也許我們應該,但現在不需要) – Peli 2010-11-01 14:36:31

回答

1

難道這只是使用多線程執行測試的'運行所有測試'的副作用嗎?那麼,Dissert()在Assert觸發時沒有運行?

嘗試使用ManualResetEvent阻止測試方法,直到Dispose()運行?就像是;

public void UnitTestX() 
{ 
    // use this to block the test thread until Dispose() is run 
    ManualResetEvent mre = new ManualResetEvent(false); 

    bool disposeCalled = false; 
    bool getCalled = false; 

    ClassX classX = new ClassX(); 
    var data = new SIClassXData 
        { 
         Dispose =() => { 
          disposeCalled = true; 
          mre.Set(); // release the test thread now 
         }, 
         Get =() => getCalled = true, 
         ClassXGet =() => classX 
        }; 

    MDataLayerFactory.CreateDataLayerObject(() => (IClassXData)data); 

    Assert.IsTrue(mre.WaitOne(1000)); // give it a second to fire 
    Assert.IsTrue(disposeCalled); 
    Assert.IsTrue(getCalled); 
} 
相關問題