TDD: Справка с записью Тестируемого Класса

Удалить all()

$query = Blog::find()->where(['status'=>1])->multilingual()->orderBy(['id'=>SORT_DESC]);

$totalCount = clone $query;
$pagination = new Pagination(['totalCount' => count($totalCount->all())]);
6
задан Spoike 23 January 2009 в 17:13
поделиться

5 ответов

Одно решение не состоит в том, чтобы сделать, чтобы конструктор сделал работу:

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));
}
8
ответ дан 9 December 2019 в 22:41
поделиться

Я, вероятно, создал бы новую общественность конструктора PurchaseOrder (представьте newNumber в виде строки, представьте новую строку в виде строки). IMO, Вам, вероятно, будет нужен он так или иначе.

0
ответ дан 9 December 2019 в 22:41
поделиться

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

В Вас основной проект, помещенный что-то вроде этого;

[assembly: InternalsVisibleTo( "UnitTests" )]

Где UnitTests является названием Вашей опытной сборки.

2
ответ дан 9 December 2019 в 22:41
поделиться

Создайте частное средство доступа для своего класса в тестовом проекте и затем используйте средство доступа для установки свойств для теста. В 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);
}
1
ответ дан 9 December 2019 в 22:41
поделиться

немного offtopic :)

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

просто мои 2 цента...

0
ответ дан 9 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

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