決して道をInternalsVisibleTo
たどらないでください - 私にリストを始めさせないでください.
絶対にできない場合 (よく考えてみてください。ほとんどの場合、パブリック API の一部とは見なされない内部を名前空間に配置する方がはるかに優れているため、何も散らかりません。たとえば Xunit.Sdk や雇用者に使用したさまざまな.Internal
サブ名前空間)、この For Tests Only の公開を管理する正しい方法は、 For Tests Only の概念です。注: これに名前が付いている理由は、xUnit Test Patterns bookでアンチパターンとして (正しく) 呼び出されているためです。
さて、あなたの質問に答えるために...
- ユーザーが一般的に必要としないものを別の名前空間に隠すことを検討してください
- 絶対に使用しないでください
InternalsVisibleTo
- テスト専用コードを使用しないでください
ソフトウェアの内部 (おそらく ?) ビルドでのみ公開されるファクトリを公開し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>();
}