Утверждение.AreEqual при сбое вызывает исключение

#c# #nunit

#c# #nunit

Вопрос:

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

Я делаю

 Assert.AreEqual(exists, 1 == (int)ExecScalar(string.Format("SELECT COUNT(*)    
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{0}{1}' AND TABLE_SCHEMA ='{2}'", 
            (audit ? DBHelper.AuditTablePrefix : ""), tableName, schema)));
 

Здесь существует = true, а в моем случае другое значение равно 1 == 0, поэтому оно говорит ожидаемое значение True, но false .

Итак, что мне делать, потому что я не знаю, как мне двигаться дальше.

Заранее спасибо.

Комментарии:

1. Что вы пытаетесь протестировать? Какое допустимое условие выхода для теста?

2. Приобретите привычку использовать параметризованные запросы везде. Предотвратите атаки с использованием SQL-инъекций!

Ответ №1:

Похоже, вы пытаетесь гарантировать, что конкретный запрос возвращается 1 при подсчете таблиц, я бы посоветовал вам включить такой сложный запрос Assert.DoesNotThrow() и использовать Assert.AreEqual() для сравнения двух значений:

 int numberOfTables = -1;

Assert.DoesNotThrow(() => numberOfTablesRaw = 
             (int)ExecScalar(string.Format(
             "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{0}{1}' AND TABLE_SCHEMA ='{2}'",  
             (audit ? DBHelper.AuditTablePrefix : ""), 
              tableName, 
              schema)));

Assert.AreEqual(1, numberOfTables); 
 

Ответ №2:

если необходимо вызвать исключение (ожидаемая ситуация), вы можете использовать этот код:

 Assert.Throws<ArgumentException>(delegate { throw new ArgumentException() } );
 

или добавить

 [ExpectedException(typeof(ArgumentException))]
 

рядом с вашим объявлением [Test].

Комментарии:

1. Я бы использовал Assert.Throws<ArgumentException>(() => classUnderTest.SomeMethod()); я не пропускаю старый синтаксис делегата.