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

Я пытаюсь смоделировать ответную полезную нагрузку от 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 ответ

Решение

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

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

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

<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-процессоры в их собственный поток и вместо этого смоделировать поток, чтобы кеш никогда не использовался в ваших тестах.

Другие вопросы по тегам