サードパーティのSDKで定義されているクラスとインターフェイスを(Moqを使用して)モックしようとしています。 「具体的なクラスを模擬するときにプロパティを設定する方法
var mockVehicle = new Mock<IVehicule>(MockBehavior.Strict);
mockVehicle
.SetupGet(v => v.Type)
.Returns("My custom vehicle");
が、私はJeep
クラスに固有のユニットテストを記述する必要があり、私ができる:
public interface IVehicle
{
string Type { get; }
}
public class Vehicle
{
public string Type { get; }
}
public class Jeep : Vehicle, IVehicle
{
}
私は簡単そうのようなインターフェースを模擬することができます:ここでは、彼らがどのように見えるかの簡単な例を示しますそれを模倣する方法を理解していない。
私の最初の試み:
var mockJeep = new Mock<Jeep>(MockBehavior.Strict);
は、次のエラーをもたらした:私はセットアップType
性質を持っていないので、
Moq.MockException: IVehicle.Type invocation failed with mock behavior Strict.
All invocations on the mock must have a corresponding setup.
に理解しています。
私の第二の試み:
System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: v => v.Type
Vehicle
クラスのType
プロパティは仮想ではないためにも理解しやすいです:
var mockJeep = new Mock<Jeep>(MockBehavior.Strict);
mockJeep
.SetupGet(v => v.Type)
.Returns("Jeep");
は、次のエラーメッセージが得られました。
私の質問は:Jeep
クラスを嘲笑するときにType
プロパティを設定する方法はありますか?
することができますようになります。少なくともmoqを使用しないで、具体的なクラスを模倣しないでください。第二に、あなたはそれをテストするために 'Jeep'クラスを模擬する必要はありません。モックを作成するとは、* fake *オブジェクトの一種を作成することを意味します。 – meJustAndrew
この場合Moqができるのは、 'Jeep'の派生クラスとしてプロキシを作成することですが、' Type'プロパティをオーバーライドすることはできません。 Microsoft Fakesは、Visual Studioのライセンスレベルがあれば、Moqとうまく対戦します。他の解決策もありますが、私が考えることができるのは、ユニットテストでMoqを完全に置き換えるのではなく、完全に置き換えることです。私はこれを答えとして書き直します。 – RavB
@RavB:ヒントのおかげで、私はMicrosoft Fakesで自分自身を教育します – desautelsj