2012-08-15 54 views
2

这可能是我需要摆脱我的系统的哲学咆哮,另一方面我可能做错了什么,如果是的话请告诉我!TestMethod生成错误CS0201

我有一个单元测试看起来是这样的:

[TestMethod] 
[ExpectedException(typeof(NotImplementedException))] 
public void Test_XXXAccess() 
{ 
    ControlPoint.MyObject.XXXAccess; 
} 

,检查,当测试是在一个特定的上下文中运行的性能XXXAccess未实现。此测试会生成编译错误CS0201:“只有赋值,调用,增量,减量和新对象表达式可用作语句”虽然我同意这是生产代码中的错误,但我认为错误适用于单元测试。当然,我可以重新编写代码:

[TestMethod] 
[ExpectedException(typeof(NotImplementedException))] 
public void Test_XXXAccess() 
{ 
    MyType x = ControlPoint.MyObject.XXXAccess; 
} 

但是,这(对我来说)似乎更不正确的,你现在已经分配成一个变量做无非静音错误更多。

有没有更好的方法来编写测试?

+1

除非您在''get''方法中使用'XXXAccess'属性的副作用,除非您小心,否则这本身可能是不好的做法,我会说第二个版本是唯一正确的版本。要求编译器记住你想要的东西很难。 :) – HonkyTonk 2012-08-15 14:30:03

+0

嗯...嗯,我使用了很多'Mock'对象来实现我的公共接口 - 这些是抛出异常的东西。我的测试检查这些调用得到了那么多,因为如果没有权限访问这些方法,我有代理会抛出不同的异常....所以我猜这可能是不好的做法 - 但它似乎是最好的方法的东西。 – diversemix 2012-08-15 14:43:26

回答

2

如果您想检查该类型没有该名称的属性,则测试应使用typeof(whatever)上的反射;如果你想检查吸气器/设定器方法抛出NotImplementedException,你需要实际上电话那个方法。毕竟,你可能已经实现了getter而不是setter;但是,在这种情况下,你想要“提及”财产做什么?最好实际拨打您感兴趣的代码并断言发生了什么。

我想如果这是你有兴趣,吸气,你能够反映获得getter方法,那么就Invoke它(这不会需要声明一个局部,你那么不使用),但这比你已经确定的解决方案要冗长得多。

+0

感谢您的回复。我无法使用反射,因为该属性将始终存在。这是一个只读属性,即没有setter,我想测试调用getter会抛出NotImplementedException ...生成错误的测试就是这样做的,它应该调用我感兴趣的代码,但是alas会生成错误:( – diversemix 2012-08-15 14:36:46