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