3

私は次のようなことをしました

public class Foo
{
    public Bar { get; set; }
}

public class Bar
{
    internal Bar(string id)
    {}
}

public static class Bars
{
     public static class TypeOne
     {
           public static readonly SimpleBar = new Bar("id-for-type1-simple-bar");
     }
}

ここで、ユニット テスト アセンブリに を追加しInternalsVisibleToて、内部 Bar ctor にアクセスできるようにしてから、次のようにしました。

var fixture = new Fixture();
fixture.Register(() => new Bar(fixture.CreateAnonymous<string>()));
var foo = fixture.CreateAnonymous<Foo>();

質問:
それは AutoFixture を利用する「正しい」方法でしたか、それとももっと良い方法がありますか?

4

3 に答える 3

2

代わりにこのようなことをすることはできませんか?

fixture.Inject(Bars.TypeOne.SimpleBar);

これはすべて公開です。InternalsVisibleTo は必要ないと思います...

于 2012-04-25T20:04:25.033 に答える
2

Bar を参照する public static クラスが既にあるため、このコードは機能します。これは、InternalsVisibleTo属性を設定しなくても機能します。

        var fixture = new Fixture().Customize(new AutoMoqCustomization());

        fixture.Inject(Bars.TypeOne.SimpleBar);

        var sut = fixture.CreateAnonymous<Foo>();

        sut.Should().NotBeNull();
        sut.Bar.Should().NotBeNull();
        sut.Bar.Should().Be(Bars.TypeOne.SimpleBar);
于 2012-04-26T00:28:05.297 に答える
2

決して道をInternalsVisibleToたどらないでください - 私にリストを始めさせないでください.

絶対にできない場合 (よく考えてみてください。ほとんどの場合、パブリック API の一部とは見なされない内部を名前空間に配置する方がはるかに優れているため、何も散らかりません。たとえば Xunit.Sdk や雇用者に使用したさまざまな.Internalサブ名前空間)、この For Tests Only の公開を管理する正しい方法は、 For Tests Only の概念です。注: これに名前が付いている理由は、xUnit Test Patterns bookでアンチパターンとして (正しく) 呼び出されているためです。


さて、あなたの質問に答えるために...

  1. ユーザーが一般的に必要としないものを別の名前空間に隠すことを検討してください
  2. 絶対に使用しないでくださいInternalsVisibleTo
  3. テスト専用コードを使用しないでください

ソフトウェアの内部 (おそらく ?) ビルドでのみ公開されるファクトリを公開しDEBUGます (ただし、別の名前空間で無条件にするのが理想的です)。

#if INCLUDE_FOR_TEST_ONLY
public static class BarsForTestOnly
{
    public static Bar Create( string id )
    {
        return new Bar( id );
    }
}
#endif

そして、次のように使用します。

#if INCLUDE_FOR_TEST_ONLY
public class Facts
{

[Fact]
public void Fact()
{
    Fixture fixture = new Fixture();
    fixture.Register( ( string name ) => BarsForTestOnly.Create( name ) );
    var anonymousBar = fixture.CreateAnonymous<Bar>();
}

[Fact]
public void FactSyntax2() // Just a variant of Fact above
{
    Fixture fixture = new Fixture();
    fixture.Register<string, Bar>( BarsForTestOnly.Create );
    var anonymousBar = fixture.CreateAnonymous<Bar>();
}

[Fact]
public void UsingFromFactory()
{
    Fixture fixture = new Fixture();
    fixture.Customize<Bar>(  x=> x.FromFactory<string>( BarsForTestOnly.Create ) );
    var anonymousBar = fixture.CreateAnonymous<Bar>();
}
#endif

あるいは、あなたが持っているものをJust Workにするために、次のことができます:

[Fact]
public void UsingCtor()
{
    Fixture fixture = new Fixture();
    fixture.Register( ( string name )=> new Bar( name ) );
    var anonymousBar = fixture.CreateAnonymous<Bar>();
}
于 2012-04-26T07:53:21.490 に答える