2010-10-13 69 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); 
} 
相关问题