5

偽造しようとしている複雑なオブジェクトがあります。

interface IContext
{
    User User { get; }
}

A.CallTo(
    () => _fakeContext.User.Subscription.Attributes)
    .Returns(new List<Attribute>());

しかし、次の例外があります。

The current proxy generator can not intercept the specified method for the following reasons: - Non virtual methods can not be intercepted

ネストされた型はすべてプロパティであり、get; set;プロパティ修飾子を持つ単純な貧血型です。そして、デバッガーを調べると、それらはすべて偽物です。

チェーンの最後のプロパティをセットアップし、以前のすべてのプロパティをセットアップしないようにする方法はありますか?

4

1 に答える 1

3

オブジェクトが十分に貧血である場合は、AutoFixtureを試してみてください:

var fake = A.Fake<>();
var fixture = new Fixture();
// If it's possible [1], AutoFixture will generate entire object graph
var user = fixture.CreateAnonymous<User>();
// Since data will be random [2], you can overwrite properties as you like
user.User.Subscription.Attributes = new List<Attributes>();
A.CallTo(() => fake.User).Returns(user);
  1. それが機能するためには、カスタム オブジェクトにパブリック コンストラクターが必要であり、できればインターフェイスの使用を避ける必要があります (ただし、AutoFakeItEasy などの自動モック拡張機能で軽減できます)。
  2. この.Buildメソッドは、オブジェクトの自動生成をカスタマイズする流暢な API を提供するため、ランダム性を制御できます。
于 2013-01-17T16:20:10.247 に答える