3

コントローラー用の簡単な単体テストをいくつか作成しようとしていますが、問題が発生しました。

MVC 4 で新しいメンバーシップ プロバイダーを使用し、WebSecurity.CurrentUserIdその値を取得してデータベースに保存しています。

WebSecurityこれに対して単体テストを実行すると失敗します。これは、まったく嘲笑されていないという事実にまでさかのぼると思います。

これが私のコードです。

コントローラー

    [HttpPost]
    public ActionResult Create(CreateOrganisationViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            Group group = _groupService.Create(
                new Group
                {
                    Name = viewModel.Name,
                    Slug = viewModel.Name.ToSlug(),
                    Profile = new Profile
                    {
                        Country = viewModel.SelectedCountry,
                        Description = viewModel.Description
                    },
                    CreatedById = WebSecurity.CurrentUserId,
                    WhenCreated = DateTime.UtcNow,
                    Administrators = new List<User> {_userService.SelectById(WebSecurity.CurrentUserId)}
                });
            RedirectToAction("Index", new {id = group.Slug});
        }
        return View(viewModel);
    }

テスト

    [Test]
    public void SuccessfulCreatePost()
    {
        CreateOrganisationViewModel createOrganisationViewModel = new CreateOrganisationViewModel
        {
            Description = "My Group, bla bla bla",
            Name = "My Group",
            SelectedCountry = "gb"
        };

        IUserService userService = MockRepository.GenerateMock<IUserService>();
        IGroupService groupService = MockRepository.GenerateMock<IGroupService>();
        groupService.Stub(gS => gS.Create(null)).Return(new Group {Id = 1});
        GroupController controller = new GroupController(groupService, userService);
        RedirectResult result = controller.Create(createOrganisationViewModel) as RedirectResult;
        Assert.AreEqual("Index/my-group", result.Url);
    }

ありがとう

4

1 に答える 1

4

考えられる解決策は、WebSecurity の周りにラッパー クラスを作成することWebSecurityWrapperです。ラッパーのインスタンス メソッドなどの静的 WebSecurity メソッドをWebSecurity.CurrentUserId公開します。この場合のラッパーの仕事は、 へのすべての呼び出しを委譲することだけWebSecurityです。

のコンストラクターに注入WebSecurityWrapperします。GroupControllerこれで、選択したモック フレームワークを使用してラッパーをスタブし、コントローラー ロジックをテストできます。

お役に立てれば。

于 2013-04-18T08:14:16.023 に答える