как выполнить модульное тестирование, следуя методу, возвращая значение с помощью «ref» - PullRequest
1 голос
/ 19 января 2010

У меня есть похожие методы на бизнес-уровне. Я новичок в модульном тестировании и иногда путаюсь. Для идеи, можете ли вы предложить, что будет лучшим подходом для тестирования этого метода поведение? Я использую C # NUnit и Moq

public int? AddNewCatRetID(string categoryName)
{
  int? categoryID = 0;
  Adapter.AddNewBlogCategoryReturnID(categoryName, ref categoryID);

  if (categoryID.HasValue)
    return categoryID;

  return 0;
}

где

Adapter = Visual Studio 2008, сгенерированный конструктором данных TableAdater

AddDeveloperCategoryReturnID() = Имя функции, которая использует хранимую процедуру в БД

Добавляет новую запись "Категория" и возвращает автоматически созданный идентификатор. Если он не равен нулю, мы берем этот результат для дальнейшей обработки.

Я знаю, что не следует интересоваться разговором с базой данных, ниже приведена процедура, просто чтобы дать представление о том, что происходит в БД

PROCEDURE [dbo].[AddDeveloperCategoryReturnID]

@NAME NVARCHAR(MAX),
@CATEGORY_ID INT OUTPUT
AS
 BEGIN
 INSERT INTO [AllTimeGreatProgrammersDateBase].dbo.CATEGORIES(NAME )
 VALUES (@NAME );

 SET @CATEGORY_ID = SCOPE_IDENTITY();

 SELECT @CATEGORY_ID;
END

некоторые проблемы

  • как проверить значения, возвращаемые с помощью "ref" из метода
  • что вы предпочитаете тестировать, а не тестировать? будет здорово, если сможете перечислить

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Существует несколько вариантов в зависимости от характеристик типа адаптера. Если AddDeveloperCategoryReturnID имеет значение virtual или interface member, вы, скорее всего, можете использовать Test Double (либо свернутый вручную, либо динамический макет) для замены его поведение с некоторым поведением, специфичным для теста.

Если это не виртуальный метод, у вас есть два варианта:

  • Измените метод, чтобы сделать его более тестируемым.
  • Напишите автоматизированный тест, включающий обратную передачу базы данных.

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

С другой стороны, если вы считаете, что хранимая процедура представляет собой ценный актив кода, который должен быть защищен автоматическим тестом, у вас нет другого выхода, кроме как написать тест базы данных.

1 голос
/ 19 января 2010

Я бы сначала преобразовал Adapter.AddNewBlogCategoryReturnID(categoryName, ref categoryID), чтобы вместо возврата переменной по ссылке он просто возвращал значение.

Затем я бы извлек это в виртуальный метод.

Чтобы протестировать AddNewCatRetID, я бы расширил класс для создания тестируемой версии и переопределил этот виртуальный метод для возврата int?, хранящегося в публичной переменной.

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

...