Есть ли способ смоделировать полезную нагрузку из одного и того же HTTP-запроса в области кэша в разных тестовых случаях для набора? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь смоделировать полезную нагрузку ответа от HTTP-запроса следующим образом:

        <munit-tools:mock-when doc:name="doc-name"
            doc:id="doc-id" processor="http:request">
            <munit-tools:with-attributes>
                <munit-tools:with-attribute
                    attributeName="doc:name" whereValue="#['DOCNAME']" />
            </munit-tools:with-attributes>
            <munit-tools:then-return>
                <munit-tools:payload mediaType="application/json"
                    value="#[MunitTools::getResourceAsString('testPayloadA.json')]" />
            </munit-tools:then-return>
        </munit-tools:mock-when>

Затем в другом тестовом примере я высмеиваю тот же HTTP-запрос следующим образом:

        <munit-tools:mock-when doc:name="doc-name"
            doc:id="doc-id" processor="http:request">
            <munit-tools:with-attributes>
                <munit-tools:with-attribute
                    attributeName="doc:name" whereValue="#['DOCNAME']" />
            </munit-tools:with-attributes>
            <munit-tools:then-return>
                <munit-tools:payload mediaType="application/json"
                    value="#[MunitTools::getResourceAsString('testPayloadB.json')]" />
            </munit-tools:then-return>
        </munit-tools:mock-when>

По сути, макет имеет одинаковую структуру как минимум для 4 случаев, когда я пытаюсь оценить поведение, которое варьируется в зависимости от содержимого полезной нагрузки, получаемой из запроса Http с именем DOCNAME.Дело в том, что этот запрос заключен в область кэша.Это означает, что если я попытаюсь запустить тестовые случаи по отдельности, они выполнят это успешно, но когда все наборы запущены, первый случай выполняется нормально, а последующие - неудачно.

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

1 Ответ

0 голосов
/ 23 января 2019

Так что я предполагаю, что тесты не пройдены, потому что предыдущее значение кэшировано.Это может быть связано со стратегией кэширования и, возможно, использованием разных данных для каждого теста, поэтому кэш всегда пропадает.

Но если вам нужно использовать похожие данные, вы можете очистить кеш перед каждым тестом.Например:

С учетом этого потока настройте хранилище именованных объектов и стратегию кэширования, использующую указанное хранилище объектов:

<os:object-store name="myObjectStore" doc:name="Object store"
        doc:id="25cec35b-2680-4754-8073-633f3e60a34f" />
    <ee:object-store-caching-strategy
        name="Caching_Strategy" objectStore="myObjectStore" doc:name="Caching Strategy"
        doc:id="fd059f4f-d3be-4971-a36c-374506e2db49" />

    <flow name="httpCache">
        <ee:cache cachingStrategy-ref="Caching_Strategy"  doc:name="Cache"  doc:id="0dcabdb4-d6fc-41d5-aebd-77d015e02dd7" >
            <http:request method="GET" doc:name="Request" doc:id="366184e9-6c0b-41d4-8414-3dfdd047ecb2" url="http://google.com"/>
            <logger level="ERROR" message="CACHE MISS" />
        </ee:cache>
        <logger level="ERROR" message="After cache: #[payload]" />   
    </flow>

Затем выполните ваши тесты, настройте действие перед очисткой этого хранилища:

<munit:before-test name="clearOS" description="clears OS">
            <os:clear objectStore="myObjectStore" doc:id="cd931ce7-6945-4dc9-919a-3ff9b158d746" />
    </munit:before-test>

    <munit:test name="new-test-suite-httpCacheTest" description="Test" doc:id="b8e299ea-d191-4c0a-ac71-27a12b28d275" >
        <munit:behavior >
            <munit-tools:mock-when doc:name="Mock when" doc:id="8bf1468d-c9c1-48a1-9009-bae02bf8e788" processor="http:request">
                <munit-tools:with-attributes >
                    <munit-tools:with-attribute attributeName="doc:name" whereValue="Request" />
                </munit-tools:with-attributes>
                <munit-tools:then-return >  
                     <munit-tools:payload value="#['mockPayload']"/>
                </munit-tools:then-return>
            </munit-tools:mock-when>
        </munit:behavior>
        <munit:execution >
            <flow-ref doc:name="Flow-ref to httpCache" doc:id="2dd44c7b-f250-4852-9e53-f4eee3b5ad84" name="httpCache"/>
        </munit:execution>
        <munit:validation >
            <munit-tools:assert-that doc:name="Assert that" doc:id="6521459d-04dd-4e59-8a2e-16a27f51c091" expression="#[payload]" is="#[MunitTools::notNullValue()]"/>
        </munit:validation>
    </munit:test>

    <munit:test name="new-test-suite-httpCacheTest2" description="Test" doc:id="d6ea0d83-f943-450e-948c-26596bf41207" >
        <munit:behavior >
            <munit-tools:mock-when doc:name="Mock when" doc:id="8688876f-144e-4f7f-8ef0-98a8e6caeca0" processor="http:request">
                <munit-tools:with-attributes >
                    <munit-tools:with-attribute attributeName="doc:name" whereValue="Request" />
                </munit-tools:with-attributes>
                <munit-tools:then-return >  
                     <munit-tools:payload value="#['mockPayload2']"/>
                </munit-tools:then-return>
            </munit-tools:mock-when>
        </munit:behavior>
        <munit:execution >
            <flow-ref doc:name="Flow-ref to httpCache" doc:id="b4a1d37a-f0e4-4fa1-9c78-084ed3f6faf8" name="httpCache"/>
        </munit:execution>
        <munit:validation >
            <munit-tools:assert-that doc:name="Assert that" doc:id="46febad5-d557-4152-829e-db61aa6ef409" expression="#[payload]" is="#[MunitTools::notNullValue()]"/>
        </munit:validation>
    </munit:test>

Оба из них будут регистрировать:

LoggerMessageProcessor: CACHE MISS

И затем:

LoggerMessageProcessor: After cache: mockPayload

LoggerMessageProcessor: After cache: mockPayload2

Где, как без os: clear, он пропустит только кешв первый раз и распечатайте ту же полезную нагрузку из кэша:

 LoggerMessageProcessor: CACHE MISS
 LoggerMessageProcessor: After cache: mockPayload

 LoggerMessageProcessor: After cache: mockPayload

Или, в качестве альтернативы, вы можете переместить кеш и http-процессоры в их собственный поток и вместо этого смоделировать поток, чтобы кеш никогда не использовался в ваших тестах..

...