5

ジェネリックが2つのインターフェースを実装している私のクラスの実装は次のとおりです...

public class ClassA<TGeneric> : where TGeneric: IInterfaceA, IInterfaceB

クラスAをモックしたい。ただし使えない

var mock = new Mock<Class<A<IInterfaceA>>();

また

var mock = new Mock<Class<A<IInterfaceB>>();

ジェネリックは両方のインターフェースの実装を必要とするためです。moq で As() メソッドを使用して複数のインターフェイスを持つオブジェクトをモックできることはわかっていますが、実際にはオブジェクトはなく、ジェネリック型です。

考え?

ありがとう...

4

2 に答える 2

10

インターフェイス A と B の両方を含むインターフェイスを (テスト目的でテスト プロジェクトに) 定義し、それをモックで使用できます。

public interface ICanTestAAndB : IInterfaceA, IInterfaceB {}

var mock = new Mock<ClassA<ICanTestAAndB>>();
于 2013-04-22T17:52:21.797 に答える
1

受け入れられた答えの代わりに、モックされたオブジェクトをキャストすることで必要なものを達成できdynamic、実行時に期待どおりに機能します。

void Main()
{
    var mockA = new Mock<IIntA>();
    mockA.Setup(a => a.DoA()).Returns(3);

    var mockB = mockA.As<IIntB>();
    mockB.Setup(iib => iib.DoB()).Returns(7);

    dynamic d = mockB.Object;

    TakeBoth(d);
}

void TakeBoth<T>(T obj) where T : IIntA, IIntB
{
}

public interface IIntA { int DoA(); }
public interface IIntB { int DoB(); }
于 2020-05-28T10:00:35.930 に答える