Если я правильно интерпретирую ваш исходный вопрос, я думаю, что ограничение убийцы здесь:
Итак, без насмешливых отношений между моделями, где мой тест будет принадлежать?
Если насмешка запрещена, и вам необходимо прикоснуться к БД, то, по вашему / и определению Google, она должна рассматриваться как тест интеграции / среднего размера :)
Я так думаю об этом, чтобы получить функциональность атрибута price отдельно от БД. Хотя это в модели, цены могут прийти откуда угодно. Сейчас это СУБД, но что если ваша организация станет действительно большой и разделится на другую службу? По сути, я считаю, что способность getPriceAttributes
отличается от хранения атрибутов:
public function getPriceAttribute($)
{
return $this->prices()->first() * 2;
}
Если вы купитесь на это рассуждение, оно создаст логическое разделение, которое поддерживает модульные тесты. prices()
можно смоделировать, чтобы получить коллекцию из 0, 1 и многих (2) результатов. Этот тест может быть выполнен как модульные тесты (для более быстрого выполнения теста на несколько порядков (т. Е. Порядка 1 мс против потенциально 10 с или 100 с мс при разговоре с локальной БД)
Я не знаком с тестовой экосистемой php, но один из способов сделать это может быть с помощью специфичного для теста подкласса (не уверен, что следующее действительное PHP: p):
class PricedModel extends YourModel {
function __construct($stub_prices_supporting_first) {
$this->stub_prices = $stub_prices_supporting_first;
}
public function prices() {
return $this->stub_prices;
}
}
Тесты
function test_priced_model_0_prices() {
p = new PricedModel(new Prices(array()));
assert.equal(null, p.getPriceAttribute());
}
function test_priced_model_1_price() {
p = new PricedModel(new Prices(array(1)));
assert.equal(2, p.getPriceAttribute());
}
function test_priced_model_2_prices() {
p = new PricedModel(new Prices(array(5, 1)));
assert.equal(10, p.getPriceAttribute());
}
Вышесказанное должно, надеюсь, позволить вам полностью контролировать ввод в метод getPriceAttribute
для поддержки прямого тестирования модулей без ввода-вывода.
-
Кроме того, все приведенные выше модульные тесты могут сказать вам, что вы в состоянии правильно обрабатывать цены, при этом вы не получите никакой обратной связи, если сможете запросить цены!