为何MicrosoftTestTools中TestContext属性仅用原名才能正常工作?
为什么MsTest里只有命名为TestContext的属性能被自动赋值?
嗨,这问题问得特别到位,刚好说到MsTest框架的一个核心设计细节——约定式注入!
核心原因:MsTest靠固定属性名识别并注入TestContext
MsTest框架在初始化测试类的时候,会通过反射机制扫描你的类(包括基类)的公共可写属性。它内部硬编码了一个规则:寻找名为TestContext的属性,一旦找到,就会把当前测试的上下文实例自动赋值给它。
这就像框架在说:“嘿,我找遍了你的类,只要看到叫TestContext的公共可写属性,我就把测试上下文塞进去给你用!”
为什么改名叫CurrentContext就不行?
当你把属性名改成CurrentContext后,框架扫描的时候找不到它要的那个“TestContext”名字的属性,自然不会给这个属性赋值。所以你的CurrentContext从始至终都是null,在TestCleanUp里当然拿不到值。
补充:MsTest里的“约定优先”设计
其实不止TestContext,MsTest里很多特性对应的方法也是靠约定逻辑工作的——比如[TestInitialize]标记的方法,不管你叫什么名字都会执行,但像TestContext这种是必须严格匹配名字的,属于框架的硬性约定。
小技巧:想自定义属性名怎么办?
如果你就是想用CurrentContext这个名字,可以在TestContext的setter里同步值,比如:
public TestContext TestContext { get; set; } // 自定义属性,同步TestContext的值 public TestContext CurrentContext { get => TestContext; set => TestContext = value; }
这样框架给TestContext赋值时,CurrentContext也能拿到相同的实例啦!
内容的提问来源于stack exchange,提问作者manutd
相关产品推荐
相关产品推荐

