Как запустить OneTimeSetUp и OneTimeTearDown из внешнего класса - PullRequest
0 голосов
/ 28 сентября 2018

Здравствуйте, у меня есть пара тестовых классов, на которых я использую тот же ресурс, что и я OneTimeSetUp и OneTimeTearDown, который IEmbeddable.

Допустим, у меня есть N тестовых классов, которые вкоторый я хочу использовать OneTimeSetUp, OneTimeSetDown и ресурс (интерфейс IEmbeddedable). Как я могу создать статический класс EmbeddableController, который может быть повторно использован всеми тестовыми классами?

В основном яхочу:

-Start static Resource of type `IEmbeddedable` once
-Run TestClass 1 on resource ( set it up +tear it down)
-Run TestClass 2 on resource (set it up + tear it down)
......
-Run TestClass N on resource (set it up +tear it down)

IEВстраиваемый

interface IEmbeddedable:IDisposable {
        int ExposedPort { get; }
    }

Test_ClassX

class Test_ClassX {
            private IEmbeddedable server;
            [OneTimeSetUp]
            public  void Launch() {
                server = RedisServer.Launch();
            }
            [OneTimeTearDown]
            public void Stop() {
                this.server.Dispose();
            }

            [TestCase()]
            public async Task CanRunEmbeddedServer() {

                using (server) {
                    var multi = new Multiplexer();
                    using (var link = multi.OpenLink(Address.Create(Port:server.ExposedPort))) {
                        string rez=await link.FlushAllAsync();
                        Assert.AreEqual(rez, "OK");
                    }


                }
            }
}

Прототип

 static class EmbeddedController {
        private static  IEmbeddedable server;
        [OneTimeSetUp]
        public static void Run() {
            server = RedisServer.Launch();
        }
        public static void Stop() {
            server.Dispose();
        }
    }

Как я могу добавить этот последний класс во все тестовые классы? Он может быть статическим или нет, в любом случае это будет только один экземпляр.

1 Ответ

0 голосов
/ 28 сентября 2018

OneTimeSetUp может работать на разных уровнях.На TestFixture он запускается один раз для прибора.На SetUpFixture он запускается один раз для пространства имен.Это дает вам несколько вариантов ...

  1. Все ваши приборы наследуются от EmbeddedController.Тем не менее, OneTimeSetUp будет работать один раз для каждого прибора.Хотя можно выполнить тест и инициализировать сервер только один раз, у вас не будет никакого способа узнать, когда был запущен тест last , чтобы вы могли его утилизировать.Я пришел к выводу, что это не будет работать для вашего случая, хотя это будет работать для всего, что не имеет ресурсов и поэтому не требует утилизации.

  2. Поместите все приспособления, которые требуют EmbeddedController в том же пространстве имен, без каких-либо других классов.Поместите EmbeddedController в то же пространство имен и сделайте его SetUpFixture.OneTimeSetUp будет запущен один раз, перед любым из приборов, а OneTimeTearDown - один раз, после того, как все приборы завершены.Чтобы приборы могли получить доступ к серверу, вы должны сделать Server статическим свойством EmbeddedController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...