我有一个单元测试调用一个构造函数,故意传入一个“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);
}
答案 0 :(得分:1)
当您单步执行代码时,您是否可能在[SetUp]方法中看到此行的执行?
_c = new CacheImplementationSelector(_listOfImplementations, _stubCacheImplementationSelectorDelegate);
该代码将在您的单元测试之前运行,而“实现”方法不会为空。
对于单元测试失败,我们能看到IsNotNullArgCheck方法的实现吗?我假设它是一些使用一些反射的扩展方法。也许那里有一个错误?