2016-08-04 6 views
5

У меня есть два класса, как этотДразнящих абстрактный класс, производный от абстрактного класса

public abstract class Foo<T> where T : Bar { 
    public Bar Do(Bar obj) { 
    //I cast to T here and the call the protected one. 
    } 
    ... 
    protected abstract Bar Do(T obj); 
} 

public abstract class FooWithGoo<T> : Foo<T> where T:Bar { 
    ... 
} 

Пытаясь издеваться это в модульном тесте с использованием Moq с этой линией new Mock<FooWithGoo<Bar>>() дает мне это исключение.

System.ArgumentException: Type to mock must be an interface or an abstract or non-sealed class. ---> System.TypeLoadException: Method 'Do' in type 'Castle.Proxies.FooWithGoo``1Proxy' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.

Есть ли что-то я делаю неправильно здесь? Как я могу издеваться над этим?

ОБНОВЛЕНИЕ: Это показывает проблему красиво для меня.

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using Moq; 
namespace UnitTestProject1 
{ 

public class Bar 
{ 

} 

public class BarSub : Bar 
{ 

} 

public abstract class Foo<T> where T : Bar 
{ 
    public Bar Do(Bar obj) 
    { 
     return null; 
    } 
    protected abstract Bar Do(T obj); 
} 

public abstract class FooWithGoo<T> : Foo<T> where T : Bar 
{ 
    public FooWithGoo(string x) 
    { 

    } 
} 

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     var mock = new Mock<FooWithGoo<Bar>>("abc"); 
     FooWithGoo<Bar> foo = mock.Object; 
    } 

    [TestMethod] 
    public void TestMethod2() 
    { 
     var mock = new Mock<FooWithGoo<BarSub>>("abc"); 
     FooWithGoo<BarSub> foo = mock.Object; 
    } 
} 
} 

Test1 не работает во время теста 2 прохода. Проблема в том, что общий абстрактный текст получает одну и ту же подпись, чем конкретный метод ... и это путается, я думаю.

+0

Я могу воспроизвести это сейчас. Твоя догадка кажется мне звуковой. – tster

ответ

0

Я смог воспроизвести вашу проблему с приведенным примером.

Я получил TestMethod1, чтобы пройти, сделав Do виртуальным методом.

public abstract class Foo<T> where T : Bar { 
    public virtual Bar Do(Bar obj) { 
     return null; 
    } 
    protected abstract Bar Do(T obj); 
} 

Moq требует, чтобы общедоступные методы были либо виртуальными, либо абстрактными, чтобы имитировать их реализацию.