Удалить all()
$query = Blog::find()->where(['status'=>1])->multilingual()->orderBy(['id'=>SORT_DESC]);
$totalCount = clone $query;
$pagination = new Pagination(['totalCount' => count($totalCount->all())]);
Одно решение не состоит в том, чтобы сделать, чтобы конструктор сделал работу:
public class PurchaseOrder
{
public PurchaseOrder(string newNumber, string newLine)
{
NewNumber = newNumber;
NewLine = newLine;
}
// ...
}
Затем тестирование легко и изолировано - Вы не тестируете GetNewNumber
и GetNewLine
одновременно.
Помочь использованию PurchaseOrder
можно создать метод фабрики, который соединяет его:
public static PurchaseOrder CreatePurchaseOrder(string purchaseOrderText)
{
return new PurchaseOrder(
GetNewNumber(purchaseOrderText),
GetNewLine(purchaseOrderText));
}
Я, вероятно, создал бы новую общественность конструктора PurchaseOrder (представьте newNumber в виде строки, представьте новую строку в виде строки). IMO, Вам, вероятно, будет нужен он так или иначе.
Вместо того, чтобы обнародовать методы set, сделайте их внутренними и затем сделайте свою опытную сборку InternalsVisibleTo в Вашем основном проекте. Тем путем Ваши тесты видят Ваших внутренних участников, но никто еще не может.
В Вас основной проект, помещенный что-то вроде этого;
[assembly: InternalsVisibleTo( "UnitTests" )]
Где UnitTests является названием Вашей опытной сборки.
Создайте частное средство доступа для своего класса в тестовом проекте и затем используйте средство доступа для установки свойств для теста. В VS можно создать частные средства доступа путем щелчка правой кнопкой в классе, выбора Create Private Accessor и выбора тестового проекта. В Вашем тесте Вы затем используете его как так:
public void NameOfTest()
{
PurchaseOrder_Accessor order = new PurchaseOrder_Accessor();
order.NewNumber = "123456";
order.NewLine = "001";
Assert.IsTrue(order.IsValid);
}
Если у Вас есть конструктор по умолчанию, можно сделать:
public void NameOfTest()
{
PurchaseOrder order = new PurchaseOrder()
PurchaseOrder_Accessor accessor =
new PurchaseOrder_Accessor( new PrivateObject(order) );
accessor.NewNumber = "123456";
accessor.NewLine = "001";
Assert.IsTrue(order.IsValid);
}
немного offtopic :)
Используя TDD, это о записи Ваших модульных тестов сначала, затем просто напишите достаточно кода, чтобы пройти тест и после этого сделать рефакторинг. Путем записи тестов сначала необходимо точно знать то, что и возможно как программировать для создания кода тестируемым!
просто мои 2 цента...