6

UploadedFileというクラスの機能をテストする単体テストを作成したいと思います。

私が直面している問題は、このクラスの静的コンストラクターがHttpContext.Currentプロパティを使用していることです。また、クラスライブラリから単体テストを実行しているため、テスト時にHttpContextがありません。

私の静的コンストラクターを見てください:

static UploadedFile()
{
    if (HttpContext.Current == null)
        throw new Exception("web server not available");

    HttpServerUtility server = HttpContext.Current.Server;

    // SET UploadedFileMappingFile Names:
    _resourceFileNames = new StringDictionary();

    _resourceFileNames[_suppoertedFileStructures] = server.MapPath(SupportedUploadedFileStructures);
    _resourceFileNames[_supportedFileStructuresXSD] = server.MapPath(SupportedUploadedFileStructuresXSD);

    _resourceFileNames[UploadedFileEnum.UploadedFileFormatENUM.CSV.ToString()] = server.MapPath(UploadedFileColumnMap);        
}

HttpContext.Currentnullにならない ように、テスト環境で何をすればよいですか。これを正常に設定できます。

 HttpServerUtility server = HttpContext.Current.Server;
4

1 に答える 1

10

HttpContext.Currentすでに知っているように、単体テストはほぼ不可能であるため、関数で直接使用しないでください。代わりにHttpContextBaseを使用することをお勧めします。これは、クラスのコンストラクターで、またはテストしているメソッドへの引数として渡されます。これにより、このクラスのコンシューマーは実際のHttpContextWrapperに合格できるようになり、単体テストで必要なメソッドをモックできます。

たとえば、メソッドを呼び出す方法は次のとおりです。

var wrapper = new HttpContextWrapper(HttpContext.Current);
Foo.UploadedFile(wrapper);

そして、ユニットテスト(Rhino Mocksを使用)では:

var contextMock = MockRepository.GenerateMock<HttpContextBase>();
// TODO: Define expectations on the mocked object
Foo.UploadedFile(contextMock);

または、必要に応じて、コンストラクタインジェクションを使用します。

于 2010-08-13T09:01:39.047 に答える