从单元测试调用时,参数意外初始化

时间:2009-12-03 23:27:47

标签: c# unit-testing dependency-injection null castle-windsor

我有一个单元测试调用一个构造函数,故意传入一个“null”来测试null的处理。

我希望调用的方法抛出ArgumentNullException,但是当我单步执行代码时,我看到参数实际上已经初始化了。

这让我很难过,虽然我的直觉说它与DI容器(Castle Windsor)有关。

任何人都可以对此有所了解吗?

我的单元测试,null与实例化的委托一起传递:

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

调用的方法:

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

将鼠标悬停在implements参数上,代码在CacheImplementationSelectorMethod中的断点处停止,visual studio告诉我参数“implements”的Count为1且[0]为null。

我正在使用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 个答案:

答案 0 :(得分:1)

当您单步执行代码时,您是否可能在[SetUp]方法中看到此行的执行?

_c = new CacheImplementationSelector(_listOfImplementations, _stubCacheImplementationSelectorDelegate);

该代码将在您的单元测试之前运行,而“实现”方法不会为空。

对于单元测试失败,我们能看到IsNotNullArgCheck方法的实现吗?我假设它是一些使用一些反射的扩展方法。也许那里有一个错误?