Как издеваться над классами ISerializable с помощью Moq? - PullRequest
6 голосов
/ 23 апреля 2010

Я совершенно новичок в 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.VerifyIfBaseImplementsGet­ObjectData(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) с Мок.

Заранее спасибо!

Ответы [ 5 ]

5 голосов
/ 11 сентября 2013

System.Reflection.Assembly является абстрактным, поэтому вы не можете создать его новый экземпляр. Тем не менее, вы можете создать тестовый класс, который это делает, и Mock that.

Пример:

[TestMethod]
public void TestSomethingThatNeedsAMockAssembly()
{
    string title = "title";<br>
    var mockAssembly = new Mock();<br>
    mockAssembly.Setup(a => a.GetCustomAttributes(It.Is(s => s == Type.GetType("System.Reflection.AssemblyTitleAttribute")), It.IsAny())).Returns(new System.Attribute[] { new AssemblyTitleAttribute(title) } );       </p>

<code>    var c = new ClassThatTakesAssemblyAndParsesIt(mockAssembly.Object);

    Assert.IsTrue(c.AssemblyTitle == title);        
    //etc

}

public class TestAssembly : Assembly
{
    public TestAssembly()
    {
    //could probably do something interesting here
    }

}
</code>

2 голосов
/ 10 июля 2013

Как уже объяснялось, проблема в том, что Assembly не предоставляет конструктор десериализации. Это не значит, что это невозможно сделать.

Решение с использованием Moq в соответствии с вашим примером будет:

    var mock = new Mock<_Assembly>();
    result.Setup(/* do whatever here as usual*/);

Обратите внимание, что для использования _Assembly вам понадобится ссылка System.Runtime.InteropServices

2 голосов
/ 23 апреля 2010

Проблема не в интерфейсе ISerializable.Вы можете макетировать классы ISerializable.

Обратите внимание на сообщение об исключении:

Тип System.Reflection.Assembly реализует ISerializable, но не предоставил конструктор десериализации

Проблема в том, что Assembly не предоставляет конструктор десериализации.

1 голос
/ 14 мая 2010

Вместо макета вы можете попробовать создать динамическую сборку и построить из нее.

var appDomain = AppDomain.CurrentDomain;
var assembly = appDomain.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.ReflectionOnly);
0 голосов
/ 06 марта 2019

Мне просто нужно убедиться, что встроенный ресурс работает правильно;это сработало для моей ситуации:

    public class MockableAssembly : Assembly { }

    [TestClass]
    public class ApplicationSetupTests
    {
        [TestMethod]
        public void ApplyAsposeLicense_Success()
        {
            var mockAssembly = new Mock<MockableAssembly>();
            mockAssembly.Setup(a => a.GetManifestResourceStream(It.IsAny<string>())).Returns(mockedData);

            MethodIAmTesting(mockAssembly.Object);

            mockAssembly.Verify(a => a.GetManifestResourceStream("myString"), Times.Once);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...