Параметр неожиданно инициализирован при вызове из модульного теста - PullRequest
0 голосов
/ 04 декабря 2009

У меня есть модульный тест, вызывающий конструктор с целью передачи значения null, чтобы проверить обработку нуля.

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

Это поставило меня в тупик, хотя моя интуиция говорит, что это как-то связано с контейнером DI (Castle Windsor).

Кто-нибудь может пролить свет на это?

Мой модульный тест, нулевое значение передается вместе с созданным экземпляром делегата:

 [Test]
 public void ConstructorThrowsAnExceptionWhenImplementationCollectionIsNull()
 {
     //assert
     Assert.Throws<ArgumentException>(() => new CacheImplementationSelector(null, _stubCacheImplementationSelectorDelegate));
 }

Вызванный метод:

public CacheImplementationSelector(ICollection<ICacheImplementation> implementations, CacheImplementationSelectorDelegate selectorDelegate)
{
    implementations.IsNotNullArgCheck("implementations");
    ...

При наведении курсора мыши на параметр реализаций с кодом, остановленным на точке останова в CacheImplementationSelectorMethod, Visual Studio сообщает мне, что параметр "реализации" имеет число 1, а [0] равно нулю.

Я использую ReSharper для запуска теста NUnit.

Для полноты TestFixtureSetup и SetUp являются следующими:

[TestFixtureSetUp]
public void FixtureSetUp()
{         
    _mocks = new MockRepository();
}

[SetUp]
public void Setup()
{
    _listOfImplementations = new List<ICacheImplementation>() { _stubICacheImplementation };            
    _stubCacheImplementationSelectorDelegate = MockRepository.GenerateStub<CacheImplementationSelectorDelegate>();
     _stubICacheImplementation = MockRepository.GenerateStub<ICacheImplementation>();
     _stubKeyCreator = MockRepository.GenerateStub<ICacheKeyCreator>();
     _stubStrategy = MockRepository.GenerateStub<ICachingStrategy>();
     _stubEncoder = MockRepository.GenerateStub<ICacheItemEncoder>();
     _c = new CacheImplementationSelector(_listOfImplementations, _stubCacheImplementationSelectorDelegate);
     _testObject = new object();
     _yesterday = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0));
     _tomorrow = DateTime.Now.Add(new TimeSpan(1, 0, 0, 0));
     _testString = "test";
     _tooLongKey = "a".Repeat(Cache.MaxKeyLength+1);
     _tooLongFriendlyName = "a".Repeat(Cache.MaxFriendlyNameLength + 1);
}

1 Ответ

1 голос
/ 04 декабря 2009

Возможно ли, что когда вы шагаете по коду, вы видите выполнение этой строки в методе [SetUp]?

_c = new CacheImplementationSelector(_listOfImplementations, _stubCacheImplementationSelectorDelegate);

Этот код будет выполняться перед вашим модульным тестом, и метод "реализации" не будет нулевым.

Что касается провала модульного теста, можем ли мы увидеть реализацию метода IsNotNullArgCheck? Я предполагаю, что это какой-то метод расширения, использующий некоторое отражение. Может быть, там есть ошибка?

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