访问程序集外部的内部构造函数



我在github中查看了Specflow的代码,发现了一个我无法理解的棘手问题。

第69行https://github.com/SpecFlowOSS/SpecFlow/blob/master/TechTalk.SpecFlow/ScenarioContext.cs

internal ScenarioContext(IObjectContainer scenarioContainer, ScenarioInfo scenarioInfo, ITestObjectResolver testObjectResolver)

线路97~100英寸https://github.com/SpecFlowOSS/SpecFlow/blob/master/Tests/TechTalk.SpecFlow.PluginTests/Infrastructure/WindsorPluginTests.cs

var context = new ScenarioContext(
objectContainer.Object, 
new ScenarioInfo("", "", Array.Empty<string>(), new OrderedDictionary()), 
new WindsorTestObjectResolver());

TechTalk.SpecFlow.ScenarioContext的构造函数是内部的,这意味着它只能在TechTalk.SecFlow.dll中访问。为什么它仍然可以在TechTalk.SpecFlow.PluginTests.Infrastructure.WindsorPluginTests类中访问?TechTalk.SpecFlow.PluginTests.Infrastructure.WindsorPluginTests类位于TechTalk.SecFlow.Plugin Tests.dll中。它们位于不同的程序集中。

因为InternalsVisibleTo。这允许对来自授权程序集的每个对象调用访问内部类型、方法等。

在https://github.com/SpecFlowOSS/SpecFlow/blob/master/TechTalk.SpecFlow/AssemblyAttributes.cs程序集TechTalk.SpecFlow使用以下一些属性进行装饰,将所有内部方法暴露给列出的程序集:

  • TechTalk.SpecFlow.RuntimeTests
  • TechTalk.SpecFlow.Plugin测试

这是一种非常常见和有用的技术,用于测试任何人都不应该访问但需要测试的方法。

最新更新