Прежде чем начать, я хочу прояснить, что я уже проверил решения как в этом вопросе , так и в этом вопросе .
Метод тестирования
public static DataSet ExecuteDataSet(this SqlConnection connection, string sql)
{
if (null == connection || null == sql)
{
throw new ArgumentNullException();
}
using (var command = connection.CreateCommand())
{
// Code elided for brevity
}
}
Методы испытаний
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void ExecuteDataSetThrowsForNullConnection()
{
((SqlConnection)null).ExecuteDataSet("SELECT TOP 1 * FROM prep");
}
[Test]
public void ExecuteDataSetThrowsForNullSql()
{
Assert.Throws<ArgumentNullException>(
() => Resource.Connection.ExecuteDataSet(null)
);
}
Нечетное поведение
Ни то, ни другоеверсия метода test перехватывает ArgumentNullException
, который выдается сразу после входа в метод ExecuteDataSet
.Поток управления переходит к следующей строке (using (var command = connection.CreateCommand())
), и вместо этого происходит NullReferenceException
(что, конечно, не обрабатывается ни одним из моих тестовых случаев, потому что его никогда не следует выбрасывать ).
Первоначально первый метод испытаний (ExecuteDataSetThrowsForNullConnection
) выглядел так же, как и второй (ExecuteDataSetThrowsForNullSql
).Когда Assert.Throws
не удалось поймать исключение, я провел некоторое исследование и заметил, что некоторые люди рекомендовали вместо него использовать ExpectedException
.Я изменил тестовый код соответствующим образом, но безрезультатно.
Для записи это 32-битный код .NET 3.5, протестированный в NUnit 2.5.9.Я использую TestDriven.NET для интеграции с Visual Studio, и у меня установлены последние версии NCover и NDepend.
TL; DR Вопрос
Почему неметоды тестирования, перехватывающие выбрасываемое исключение и как его исправить?
РЕДАКТИРОВАТЬ
Эта версия метода тестирования работает.
[Test]
public void ExecuteDataSetThrowsForNullConnection()
{
try
{
((SqlConnection)null).ExecuteDataSet("SELECT TOP 1 * FROM prep");
}
catch(ArgumentNullException e)
{
Assert.AreEqual(true, true);
}
catch (Exception e)
{
Assert.Fail("Expected ArgumentNullException, but {1} was thrown instead.", e.GetType().Name);
}
}