Поблочное тестирование чрезвычайно тривиальных методов (да или не)

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

TLDR;

UPDATE catalog_eav_attribute SET used_in_product_listing = 1 WHERE attribute_id = 106;

** Предупреждение, вы не должны выполнять этот запрос ^^^, пока не убедитесь, что ваш image attribute_id для сущности catalog_product равен 106!

Некоторые ответы предлагают этот метод:

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

TLDR;

[110]

** Предупреждение, вы не должны выполнять этот запрос ^^^, пока не убедитесь, что ваш image attribute_id для сущности catalog_product равен 106!

Некоторые ответы предлагают этот метод:

[111]

Вы не должны этого делать! Это потому, что вы будете делать полную загрузку продукта! Это не эффективно и, скорее всего, делается внутри цикла, что еще хуже! Извините за крики!

Я обычно не оправдываю прямое редактирование БД, но в этом случае это было самое простое решение для меня:

# First make sure we are using all the right IDs, who knows, I have seen some fubar'ed deployments

SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_product';
# 10
SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'image' AND entity_type_id = 10;
# 106

# Now that we know the exact attribute_id....
UPDATE catalog_eav_attribute SET used_in_product_listing = 1 WHERE attribute_id = 106;

Теперь данные атрибута image будут автоматически загружается на страницах с перечнем товаров, затем вы можете получить к нему доступ следующим образом:

echo $this->helper('catalog/image')->init(

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

TLDR;

[110]

** Предупреждение, вы не должны выполнять этот запрос ^^^, пока не убедитесь, что ваш image attribute_id для сущности catalog_product равен 106!

Некоторые ответы предлагают этот метод:

[111]

Вы не должны этого делать! Это потому, что вы будете делать полную загрузку продукта! Это не эффективно и, скорее всего, делается внутри цикла, что еще хуже! Извините за крики!

Я обычно не оправдываю прямое редактирование БД, но в этом случае это было самое простое решение для меня:

[112]

Теперь данные атрибута image будут автоматически загружается на страницах с перечнем товаров, затем вы можете получить к нему доступ следующим образом:

[113]

Самое приятное то, что вы не загружаете весь продукт в цикле! НЕ КОГДА-ЛИБО ДЕЛАЙТЕ ЭТО

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

product, 'image');

Самое приятное то, что вы не загружаете весь продукт в цикле! НЕ КОГДА-ЛИБО ДЕЛАЙТЕ ЭТО

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

product = Mage::getModel('catalog/product')->load(

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

TLDR;

[110]

** Предупреждение, вы не должны выполнять этот запрос ^^^, пока не убедитесь, что ваш image attribute_id для сущности catalog_product равен 106!

Некоторые ответы предлагают этот метод:

[111]

Вы не должны этого делать! Это потому, что вы будете делать полную загрузку продукта! Это не эффективно и, скорее всего, делается внутри цикла, что еще хуже! Извините за крики!

Я обычно не оправдываю прямое редактирование БД, но в этом случае это было самое простое решение для меня:

# First make sure we are using all the right IDs, who knows, I have seen some fubar'ed deployments

SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_product';
# 10
SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'image' AND entity_type_id = 10;
# 106

# Now that we know the exact attribute_id....
UPDATE catalog_eav_attribute SET used_in_product_listing = 1 WHERE attribute_id = 106;

Теперь данные атрибута image будут автоматически загружается на страницах с перечнем товаров, затем вы можете получить к нему доступ следующим образом:

echo $this->helper('catalog/image')->init(

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

TLDR;

[110]

** Предупреждение, вы не должны выполнять этот запрос ^^^, пока не убедитесь, что ваш image attribute_id для сущности catalog_product равен 106!

Некоторые ответы предлагают этот метод:

[111]

Вы не должны этого делать! Это потому, что вы будете делать полную загрузку продукта! Это не эффективно и, скорее всего, делается внутри цикла, что еще хуже! Извините за крики!

Я обычно не оправдываю прямое редактирование БД, но в этом случае это было самое простое решение для меня:

[112]

Теперь данные атрибута image будут автоматически загружается на страницах с перечнем товаров, затем вы можете получить к нему доступ следующим образом:

[113]

Самое приятное то, что вы не загружаете весь продукт в цикле! НЕ КОГДА-ЛИБО ДЕЛАЙТЕ ЭТО

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

product, 'image');

Самое приятное то, что вы не загружаете весь продукт в цикле! НЕ КОГДА-ЛИБО ДЕЛАЙТЕ ЭТО

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

item->getProduct()->getId()); echo $this->helper('catalog/image')->init(

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

TLDR;

[110]

** Предупреждение, вы не должны выполнять этот запрос ^^^, пока не убедитесь, что ваш image attribute_id для сущности catalog_product равен 106!

Некоторые ответы предлагают этот метод:

[111]

Вы не должны этого делать! Это потому, что вы будете делать полную загрузку продукта! Это не эффективно и, скорее всего, делается внутри цикла, что еще хуже! Извините за крики!

Я обычно не оправдываю прямое редактирование БД, но в этом случае это было самое простое решение для меня:

# First make sure we are using all the right IDs, who knows, I have seen some fubar'ed deployments

SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_product';
# 10
SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'image' AND entity_type_id = 10;
# 106

# Now that we know the exact attribute_id....
UPDATE catalog_eav_attribute SET used_in_product_listing = 1 WHERE attribute_id = 106;

Теперь данные атрибута image будут автоматически загружается на страницах с перечнем товаров, затем вы можете получить к нему доступ следующим образом:

echo $this->helper('catalog/image')->init(

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

TLDR;

[110]

** Предупреждение, вы не должны выполнять этот запрос ^^^, пока не убедитесь, что ваш image attribute_id для сущности catalog_product равен 106!

Некоторые ответы предлагают этот метод:

[111]

Вы не должны этого делать! Это потому, что вы будете делать полную загрузку продукта! Это не эффективно и, скорее всего, делается внутри цикла, что еще хуже! Извините за крики!

Я обычно не оправдываю прямое редактирование БД, но в этом случае это было самое простое решение для меня:

[112]

Теперь данные атрибута image будут автоматически загружается на страницах с перечнем товаров, затем вы можете получить к нему доступ следующим образом:

[113]

Самое приятное то, что вы не загружаете весь продукт в цикле! НЕ КОГДА-ЛИБО ДЕЛАЙТЕ ЭТО

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

product, 'image');

Самое приятное то, что вы не загружаете весь продукт в цикле! НЕ КОГДА-ЛИБО ДЕЛАЙТЕ ЭТО

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

product, 'image')->resize(38, 38);

Вы не должны этого делать! Это потому, что вы будете делать полную загрузку продукта! Это не эффективно и, скорее всего, делается внутри цикла, что еще хуже! Извините за крики!

Я обычно не оправдываю прямое редактирование БД, но в этом случае это было самое простое решение для меня:

# First make sure we are using all the right IDs, who knows, I have seen some fubar'ed deployments

SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_product';
# 10
SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'image' AND entity_type_id = 10;
# 106

# Now that we know the exact attribute_id....
UPDATE catalog_eav_attribute SET used_in_product_listing = 1 WHERE attribute_id = 106;

Теперь данные атрибута image будут автоматически загружается на страницах с перечнем товаров, затем вы можете получить к нему доступ следующим образом:

echo $this->helper('catalog/image')->init(

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

TLDR;

[110]

** Предупреждение, вы не должны выполнять этот запрос ^^^, пока не убедитесь, что ваш image attribute_id для сущности catalog_product равен 106!

Некоторые ответы предлагают этот метод:

[111]

Вы не должны этого делать! Это потому, что вы будете делать полную загрузку продукта! Это не эффективно и, скорее всего, делается внутри цикла, что еще хуже! Извините за крики!

Я обычно не оправдываю прямое редактирование БД, но в этом случае это было самое простое решение для меня:

[112]

Теперь данные атрибута image будут автоматически загружается на страницах с перечнем товаров, затем вы можете получить к нему доступ следующим образом:

[113]

Самое приятное то, что вы не загружаете весь продукт в цикле! НЕ КОГДА-ЛИБО ДЕЛАЙТЕ ЭТО

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

product, 'image');

Самое приятное то, что вы не загружаете весь продукт в цикле! НЕ КОГДА-ЛИБО ДЕЛАЙТЕ ЭТО

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

9
задан Robert Koritnik 3 August 2009 в 11:27
поделиться

7 ответов

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

У вас может быть много подходов к этому:

  • Создайте тест, который действительно обращается к базе данных и проверьте, было ли состояние изменено должным образом (он больше не будет модульным тестом)
  • Создайте тестовый объект, который подделывает базу данных и выполняет операции в памяти (другой реализация для вашего repositoryIocInstance) и убедитесь, что состояние было изменено должным образом. Изменения в интерфейсе репозитория повлекут за собой изменения и этого объекта. Но ваши интерфейсы не должны сильно меняться, не так ли?
  • Считайте все это слишком дорогостоящим и используйте свой подход, который может привести к ненужному нарушению тестов позже (но как только вероятность низка, можно риск)
3
ответ дан 4 December 2019 в 11:07
поделиться

Не забывайте, что модульные тесты - это не только тестирование кода. Речь идет о том, чтобы позволить вам определять , когда меняется поведение .

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

например, часто люди говорят, что вы не должны тестировать сеттеры / геттеры, поскольку они тривиальны. Я не согласен не потому, что это сложные методы, но кто-то может непреднамеренно изменить их из-за незнания, сценариев с толстыми пальцами и т. Д.

Учитывая все, что я только что сказал, я бы определенно реализовал тесты для вышеперечисленного (через насмешку, и / или, возможно, стоит разрабатывать свои классы с учетом тестируемости и иметь возможность сообщать о статусе и т. д.)

7
ответ дан 4 December 2019 в 11:07
поделиться

Общее практическое правило состоит в том, что вы проверяете все, что может сломаться. Если вы уверены, что метод достаточно прост (и остается достаточно простым), чтобы не создавать проблем, то решите проблему с помощью тестирования.

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

2
ответ дан 4 December 2019 в 11:07
поделиться

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

1
ответ дан 4 December 2019 в 11:07
поделиться

Когда в методе нет утверждения, вы, по сути, утверждаете, что исключения не генерируются.

Я также борюсь с вопросом о том, как тестировать public void myMethod (). Думаю, если вы решите добавить возвращаемое значение для проверки, возвращаемое значение должно представлять все важные факты, необходимые для того, чтобы увидеть, что изменилось в состоянии приложения.

public void myMethod()

становится

 public ComplexObject myMethod() { 
 DoLotsOfSideEffects()
 return new ComplexObject { rows changed, primary key, value of each column, etc };
 }

, а не

public bool myMethod()  
  DoLotsOfSideEffects()
  return true;
1
ответ дан 4 December 2019 в 11:07
поделиться

«ваш модульный тест завершится неудачно, но, вероятно, он не сломает ваше приложение»

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

Уловка состоит в том, чтобы расставить приоритеты.

Протестируйте важные вещи. первый. Когда дела идут медленно, добавьте тесты на тривиальные вещи.

1
ответ дан 4 December 2019 в 11:07
поделиться

Краткий ответ на ваш вопрос: Да , вы обязательно должны протестировать подобные методы.

Я полагаю, что это важно , что метод Save фактически сохраняет данные. Если вы не пишете для этого модульный тест, то откуда вы?

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

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

То, что метод Save вызывает EntitySave в репозитории, не является деталью реализации - это часть ожидаемого поведения и, если можно так сказать, довольно важная часть. Вы хотите убедиться, что данные действительно сохраняются.

Тот факт, что метод не возвращает значение, не означает, что его не стоит тестировать. В общем, если вы наблюдаете хорошее разделение команд / запросов (CQS), следует ожидать, что любой метод void изменит состояние чего-то .

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

Это называется тестированием Inderect Outputs вместо более обычного Direct Outputs (возвращаемые значения).

Уловка состоит в том, чтобы писать модульные тесты, чтобы они не ломались слишком часто. При использовании Mocks легко случайно написать Overspecified Tests , поэтому для большинства динамических Mocks (например, Moq) по умолчанию используется режим Stub , где на самом деле не имеет значения, сколько раз вы вызываете данный метод.

Все это и многое другое объясняется в превосходных xUnit Test Patterns .

1
ответ дан 4 December 2019 в 11:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: