Почему утверждение при модульном тесте с HostType ("Moles") проходит при индивидуальном запуске, но не при запуске с группой тестов? - PullRequest
0 голосов
/ 13 октября 2010

Недавно я попал на платформу Pex & 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), первое утверждение завершится неудачей.что мне нужно изменить, чтобы решить эту проблему.

1 Ответ

1 голос
/ 18 апреля 2012

Может ли это быть просто побочным эффектом «запуска всех тестов» с использованием нескольких потоков для выполнения тестов?Итак, что Dispose () не был запущен к моменту запуска 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);
}
...