1

簡単にテストできるMVCサイトにWCFクライアントを展開する方法に深刻な問題があります。実際にエンドポイントにアクセスせずに、サービスのモックを設定するのに苦労しています。

テスト対象サイトのコントローラーの例

public class ProfileController : ControllerExtended
{

    public ProfileController(IUserService membershipService, IDropDownService dropdownService, ISiteService siteService)
    {
        WCFService.Instance.Client = siteService; //Should maybe be a serpate service.
        _membershipService = membershipService;
        _dropDownService = dropdownService;
        _siteService = siteService;

    }

    public ActionResult Index()
    {
        UserComp profile = _siteService.ProfileGet(_sharedContext.CurrentUser.id);

        return View(new ProfileViewModel { Profile = profile });
    }
}

WCFシングルトン(WCFの実装が私の問題だと思いますが、インターフェイスに含める必要がありますか?)

public sealed class WCFService
{

    public SiteServiceI Client { get; set; }

    #region Singleton

    static readonly WCFService query = new WCFService();

    static WCFService()
    {
    }

    WCFService()
    {
    }

    public static WCFService Instance
    {
        get { return query; }
    }

    #endregion
}

単体テスト

[TestFixture]
public class UnitTest1
{
    private Mock<SiteService> mockSiteService;
    private Mock<IUserService> mockMembershipService;
    private Mock<IDropDownService> mockDropDown;
    private Mock<SiteServiceIClient> mockServiceClient; //new Mock<SiteServiceIClient>();


    //private Mock<WebService> mockWebService;

    [SetUp]
    public void SetUp()
    {
        mockSiteService = new Mock<ISiteService>();
        mockMembershipService = new Mock<IUserService>();
        mockDropDown = new Mock<IDropDownService>();
        mockServiceClient = new Mock<SiteServiceIClient>();

        mockWebService = new Mock<WebService>(mockServiceClient);
    }

    [Test]
    public void CheckHomeIndex_Controller()
    {

        var controller = new HomeController(mockMembershipService.Object, mockDropDown.Object, mockPTSearch.Object, mockServiceClient.Object); // mockServiceClient times out.

        Assert.AreEqual("this", "this");
    }
}

シングルトンが初期化されるとすぐにサービスをセットアップするため、エラーが発生していると思います。純粋にWCFに呼び出されるために別のサービスを実装しようとしましたが、テスト可能な方法で実装することに成功しませんでした。これが曖昧であるかどうかはわかりませんが、私はそれについて多くのことを読みましたが、詳しくはありません。

4

2 に答える 2

0

あなたの問題はあなたのサービスがシングルトンであるということです。シングルトンパターンの問題は、テストできないことです。サービスを受けるには、依存性注入を使用する必要があります。

于 2012-11-25T09:34:04.577 に答える
0

シングルトンは間違いなくあなたの問題です-シングルトンでのテストは苦痛の世界に入っています。このテストを容易にするために、ファサードパターンを実装する必要があります。このようなもの:

public interface IServiceFacade
{
    Profile ProfileGet(int id);
}

public class ServiceFacade : IServiceFacade
{

    private WCFService _theRealService = new WCFService();

    public Profile ProfileGet(int id)
    {
        return _theRealService.ProfileGet(id);
    }
}



public class Some_Tests()
{
    public void Test_Stuff_Whatever()
    {

        Mock<IServiceFacade> _facade = new Mock<IServiceFacade>();

        _facade.SetUp(Whatever.....);
    }
}
于 2012-11-25T18:34:08.517 に答える