Sree(Member 12916318) Ответов: 1

Как мы можем протестировать хранимую процедуру из базы данных с помощью объектов moq в C#?


У меня есть два ИП в базе данных. Я протестировал два sp с помощью модульного теста MS. При развертывании я столкнулся с проблемой. Я не мог получить доступ к базе данных на сервере приложений. Вот почему я придумал фреймворк moq. Мне нужно протестировать эти два sp, используя объекты moq вместо реальных вызовов базы данных. Не могли бы вы посоветовать мне, есть ли какой-нибудь лучший способ сделать это?

Что я уже пробовал:

Я уже пробовал это сделать. Просто я создал один интерфейс(moq repository) и добавил два метода.


public interface IImintMSNRepository
{
    bool InsertBulkImportPortfolios(DataTable mSNBulkImportPortfolioTVP,string updatedBy);
    bool InsertBulkImportIndexes(DataTable mSNBulkImportIndexTVP, string updatedBy);

}




Я протестировал эти два метода, используя moq, как показано ниже.

public readonly IImintMSNRepository MockMSNRepository;

public ImintMSNUnitTests()
{

    Mock<IImintMSNRepository> mockRepo = new Mock<IImintMSNRepository>();
    mockRepo.Setup(a => a.InsertBulkImportPortfolios(It.IsAny<DataTable>(), It.IsAny<string>())).Returns(true);

    mockRepo.Setup(b => b.InsertBulkImportIndexes(It.IsAny<DataTable>(), It.IsAny<string>())).Returns(true);


    this.MockMSNRepository = mockRepo.Object;
}


[TestMethod]
public void TestPortfolioSPByMOQ()
{
    MSNBulkImportPortfolioTVP ptvp = new MSNBulkImportPortfolioTVP();

    DataRow tvprow = ptvp.NewRow();

    tvprow["PortfolioCode"] = "AutomationMoq1";
    tvprow["PortfolioName"] = "AutomationMoqName1";
    tvprow["ClientName"] = "Thomson Reuters";
    tvprow["RIC"] = "IBM.N";
    tvprow["CalculationMethodology"] = "TRGE";
    tvprow["CalendarEventCode"] = "US";
    tvprow["IsProformaPortfolio"] = 1;
    tvprow["IsParentPortfolio"] = 1;
    tvprow["IsGenerateGroupFragment"] = 1;
    tvprow["IsPushLastTick"] = 1;

    ptvp.Rows.Add(tvprow);

    bool expected = true;
    bool actual;

    actual = this.MockMSNRepository.InsertBulkImportPortfolios(ptvp, "MSNMoqUnitTestProcess");
    Assert.AreEqual(expected, actual);

}

1 Ответов

Рейтинг:
5

F-ES Sitecore

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

Если вы посмотрите на код, который у вас есть...какую логику вы на самом деле проверяете? Вообще-то нет. Вы создаете datatable и вызываете свой издевательский метод с этой таблицей, и этот издевательский метод возвращает "true". Единственное, что вы тестируете, - это то, что создание DataTable не вызывает исключения.

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


Sree(Member 12916318)

Спасибо за ответ. У меня есть идея. Но я новичок в этой теме. Вот почему я хочу уточнить более подробно. Вы имеете в виду, что невозможно протестировать SP с помощью насмешливых тестовых объектов, верно?

F-ES Sitecore

Вы все еще можете вызвать SP через свои модульные тесты, Если хотите, а не насмешливый фреймворк, но вы не должны этого делать, это не то, для чего они предназначены, и вы сталкиваетесь с проблемами, которые вы нашли в отношении конфигурации, доступа к ресурсам и т. д. Набор модульных тестов-это то, что должно быть очень быстро запущено и тестирует только логику, а не внешние ресурсы, и ваш сервер сборки должен быть в состоянии запускать эти тесты также быстро и в любой среде. Когда вы начинаете получать доступ к внешним ресурсам, таким как базы данных, файловые системы, API и т. д. С помощью модульных тестов, все становится намного сложнее, поэтому насмешливые фреймворки должны обходить такой доступ.

Sree(Member 12916318)

Спасибо за ваше ценное предложение.

Sree(Member 12916318)

Спасибо за предложение. Я понял то, что вы мне объяснили. У меня было такое требование. Есть ли какая-либо возможность протестировать хранимые процедуры с помощью moq вместо реальных вызовов базы данных, отличных от MS Unit test, таких как NUnit test. Пожалуйста, предложите мне.

F-ES Sitecore

Что вы подразумеваете под "тестированием storedprocedure"? Единственный способ сделать это - вызвать базу данных. Вы используете moq, чтобы издеваться над результатами вызова SP, так что это выглядит так, как будто вы вызвали SP, но на самом деле вы этого не сделали, вы получили жестко закодированный результат обратно.

Sree(Member 12916318)

Спасибо за предложение. Я понял то, что вы мне объяснили. Пусть это будет код выше того, что я написал. У меня есть один способ. В этом случае у меня есть вызовы базы данных и хранимая процедура, передающая параметры в виде таблицы данных и строки для сохранения данных в базе данных. Я хотел бы протестировать этот метод, используя объекты moq в соответствии с требованиями. Нет никакой другой возможности сделать это, прочитав ваши комментарии выше. Это будет неправильно.Не могли бы вы предложить мне

F-ES Sitecore

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

https://www.c-sharpcorner.com/UploadFile/dacca2/unit-test-using-mock-object-in-dependency-injection/

Sree(Member 12916318)

Спасибо за предложение. Я понял то, что вы мне объяснили. Пусть это будет код выше того, что я написал. У меня есть один способ. В этом случае у меня есть вызовы базы данных и хранимая процедура, передающая параметры в виде таблицы данных и строки для сохранения данных в базе данных. Я хотел бы протестировать этот метод, используя объекты moq в соответствии с требованиями. Нет никакой другой возможности сделать это, прочитав ваши комментарии выше. Это будет неправильно.Не могли бы вы предложить мне