我正在尝试使用InternalsVisibleToassembly属性使我的单元测试项目可以看到.NET类库中的内部类.出于某种原因,我不断收到一条错误消息:
由于其保护级别,"MyClassName"无法访问
两个程序集都已签名,并且我在属性声明中列出了正确的密钥.有任何想法吗?
我插入一行:
[assembly: InternalsVisibleTo("MyTests")]
在我的test(Properties/AssemblyInfo.cs)项目中,其中MyTests是Unit Test项目的名称.但由于某种原因,我仍然无法从单元测试项目中访问内部方法.
关于我做错了什么的任何想法?
我使用Rhino Mocks作为单元测试的模拟框架.
我有一个名为Subject的类,它是我想要测试的类.它依赖于IStore.
IStore定义如下:
//internal interface : has InternalsVisible to both "Subject"
//and "StoreTests" class namespaces
internal interface IStore {
void Store(string name);
//other methods
}
Run Code Online (Sandbox Code Playgroud)
Subject类定义如下:
class Subject : IStore {
private IStore internalStore;
//constructor injection
void Subject(IStore store) {
internalStore = store;
}
void Store(string name) {
internalStore.Store(name);
}
//other methods
}
Run Code Online (Sandbox Code Playgroud)
我使用RhinoMocks的测试类如下:
//test class
class StoreTests {
Subject subject = new Subject();
[Test]
public StoreTest() {
//Arrange
var mockStore = MockRepository.GenerateMock<IStore>();
string testName = "test";
mockStore.Expect(x => …Run Code Online (Sandbox Code Playgroud) [ 当然,问题不仅限于特定的"朋友"实现,请尽可能指出相关的实施细节 ]
通过未解答的问题,我偶然发现了这个InternalsVisibleTo属性:
指定仅在当前程序集中通常可见的类型对另一个程序集可见.
MSDN上的C#编程指南有一个Friend Assemblies部分,描述了如何使用该属性允许将方法和类型用于另一个程序集.internal
我想知道使用它来创建一个"隐藏"界面来检测库以供单元测试组件使用是否是一个好主意.它似乎在两个方向上大量增加耦合(测试生产程序集中的代码,关于测试代码中生产程序集的内部知识),但另一方面,它可能有助于创建细粒度的测试而不会混乱公共接口.
您在测试时使用好友声明的经验是什么?它是你的银色子弹,还是它开始了死亡三月?
.net language-agnostic unit-testing internalsvisibleto friend
我知道InternalVisibleTo属性用于使用内部访问修饰符向指定的程序集公开类型和方法.我只使用它来将内部方法暴露给包含一组单元测试的单独程序集.
我正在努力想到应该使用它的另一个场景.该属性是否专门用于辅助单元测试,还是有其他原因?
asp.net 5之前,我想补充"internalsVisibleTo(some.namespace.name)"到AssemblyInfo.cs中 - 但我不再有我的WebAPI项目的AssemblyInfo.cs.
如何将WebAPI项目中的内部暴露给我的unitTest项目?
InternalsVisibleTo不适用于我的托管C++项目,但它适用于我的C#项目.任何帮助,将不胜感激.这是一个简化的布局.
项目A - C#,具有我想从B/C访问的内部属性.
项目B - 托管C++.引用一个.
项目Ç - C#,引用一个.
所有项目都使用相同的密钥签名.使用ILDASM或Reflector查看已编译的程序集,表明它们都已正确签名(当我注释掉内部属性用法时).
在Project A的 AssemblyInfo.cs中,我有以下InternalsVisibleTo;
[assembly: InternalsVisibleTo( "B, " +
"PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
"50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
"0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
"9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
"4306008535049A0EBB00FE47E78DCB" )]
[assembly: InternalsVisibleTo( "C, " +
"PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
"50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
"0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
"9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
"4306008535049A0EBB00FE47E78DCB" )]
Run Code Online (Sandbox Code Playgroud)
钥匙被'切',所以我知道它们是正确的.
当我尝试编译时,A&C编译正常,但项目B失败了
Error 1 error C3767: 'A::MyClass::MyProperty::get': candidate function(s) not accessible c:\Users\<snip>\CppClass.cpp 201 B
Run Code Online (Sandbox Code Playgroud)
MSDN文档说这适用于C++.我需要做一个bug还是别的什么?
是否有另一种方法可以保护财产,使其只能由我签署的集合使用?我知道我可以保护我的所有组件,但是我可以在这样的粒度级别上进行吗?
编辑
根据MSDN中的注释,我将属性更改为以下内容,但仍然无效.
[assembly: InternalsVisibleTo( "B, " + …Run Code Online (Sandbox Code Playgroud) 我有一个内部构造函数的类,想要从Unity(2.0)解析它.
public class MyClass {
internal MyClass(IService service) {
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在做
_container.Resolve<MyClass>();
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我有一个例外
Exception is: InvalidOperationException - The type MyClass cannot be constructed.
Run Code Online (Sandbox Code Playgroud)
IService已注册,唯一的问题是构造函数是内部的.我真的希望这个类是公开的,但是我希望它只能通过工厂(我实际上在调用它container.Resolve<MyClass>())中创建.
有没有办法让Unity看到内部构造函数?像InternalsVisibleTo或者什么?
我试图通过使用以下内容向我的单元测试项目公开一些内部:
[assembly: InternalsVisibleTo("MyTest")]
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误:
错误1朋友程序集引用MyTest'无效.强名称签名程序集必须在其InternalsVisibleTo声明中指定公钥..../MyClass.cs ...
当我手动分配PublicTokenKey时:
[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")]
Run Code Online (Sandbox Code Playgroud)
解决方案构建没有任何错误.
那么,为我的Test项目分配公钥的最佳和最安全的方法是什么?
所以,问题是我的程序集中有一堆内部类,我想要测试的类使用它们.由于访问器已经从VS2012中删除了,我使用起来很好,[InternalsVisibleTo]而且效果很好......除非我试图填充我的内部类,否则它们对于Fakes框架是不可见的.我还应该注意,我正在处理的特定类是一个带静态方法的静态类,我真的不想重构所有东西以使用接口(并使用存根),因为组织中的阻力到了那个级别的重构.
有没有办法让这些内部成员可以在Visual Studio 2012中使用填充程序上下文,而无需依靠接口(字面上)一切?
.net ×5
c# ×5
unit-testing ×4
assemblies ×1
attributes ×1
c++-cli ×1
friend ×1
internal ×1
rhino-mocks ×1