我对Moq完全不熟悉,现在正试图创建一个模拟器
System.Reflection.Assembly
课程。我正在使用此代码:
var mockAssembly = new Mock<Assembly>();
mockAssembly.Setup( x => x.GetTypes() ).Returns( new Type[] {
typeof( Type1 ),
typeof( Type2 )
} );
但是当我运行测试时,我会得到下一个异常:
System.ArgumentException : The type System.Reflection.Assembly
implements ISerializable, but failed to provide a deserialization
constructor
Stack Trace:
at
Castle.DynamicProxy.Generators.BaseProxyGenerator.VerifyIfBaseImplementsGetObjectData(Type
baseType)
at
Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode(Type[]
interfaces, ProxyGenerationOptions options)
at Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxy(Type
classToProxy, Type[] additionalInterfacesToProxy,
ProxyGenerationOptions options)
at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type
classToProxy, Type[] additionalInterfacesToProxy,
ProxyGenerationOptions options, Object[] constructorArguments,
IInterceptor[] interceptors)
at Moq.Proxy.CastleProxyFactory.CreateProxy[T](ICallInterceptor
interceptor, Type[] interfaces, Object[] arguments)
at Moq.Mock`1.<InitializeInstance>b__0()
at Moq.PexProtector.Invoke(Action action)
at Moq.Mock`1.InitializeInstance()
at Moq.Mock`1.OnGetObject()
at Moq.Mock`1.get_Object()
你能否告诉我正确的模拟ISerializable
课程的方法
(如System.Reflection.Assembly
)与Moq一样。
提前致谢!
答案 0 :(得分:5)
System.Reflection.Assembly是抽象的,因此您无法创建它的新实例。但是,你可以创建一个测试类,然后模拟它。
示例:
[TestMethod] public void TestSomethingThatNeedsAMockAssembly() { string title = "title";
var mockAssembly = new Mock();
mockAssembly.Setup(a => a.GetCustomAttributes(It.Is(s => s == Type.GetType("System.Reflection.AssemblyTitleAttribute")), It.IsAny())).Returns(new System.Attribute[] { new AssemblyTitleAttribute(title) } );var c = new ClassThatTakesAssemblyAndParsesIt(mockAssembly.Object); Assert.IsTrue(c.AssemblyTitle == title); //etc } public class TestAssembly : Assembly { public TestAssembly() { //could probably do something interesting here } }
答案 1 :(得分:2)
问题不在于ISerializable接口。你可以模拟ISerializable类。
请注意异常消息:
System.Reflection.Assembly类型 实现ISerializable,但失败了 提供反序列化 构造
问题是,程序集不提供反序列化构造函数。
答案 2 :(得分:1)
您可以尝试创建动态程序集并从中进行构建,而不是模拟。
var appDomain = AppDomain.CurrentDomain;
var assembly = appDomain.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.ReflectionOnly);
答案 3 :(得分:1)
正如已经解释的那样,问题是Assembly没有公开反序列化构造函数。这并不意味着它无法完成。
根据您的示例使用Moq的解决方案是:
var mock = new Mock<_Assembly>();
result.Setup(/* do whatever here as usual*/);
请注意,要使用_Assembly
,您需要引用System.Runtime.InteropServices
答案 4 :(得分:0)
我只需要验证嵌入式资源是否正常工作;这适合我的情况:
/var/hyperledger