2

メソッドに偽の実装を与えるための次の2つの方法の主な違いは何ですか?

あるテストでは2番目の方法をうまく使用していましたが、別のテストでは、最初の方法を使用しないと動作を実現できません。

だから(最初の)、

using (test.Record()) //test is MockRepository instance
{
 service.GetUser("dummyName");
 LastCall.Return(new LoginUser());
}

vs(2番目)。

service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser());

編集

問題は、2番目の手法が新しいLoginUserを返すことを期待しているときに、テストでnullを返すことです。最初の手法は、新しいLoginUserを返すことで期待どおりに動作します。両方の場合に使用される他のすべてのテストコードは同じです。

[TestFixture]
public class AuthorizationTest
{
    private MockRepository test;
    private IMembershipService service;

    [SetUp]
    public void SetUp()
    {
        test = new MockRepository();
        service = test.Stub<IMembershipService>();

        using (test.Record())
        {
            service.GetUser("dummyName");
            LastCall.Return(new LoginUser());
        }

        //service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser()); 
    }

    [Test]
    public void GetCurrentUser_UserIsAuthenticated_ReturnsCurrentUser()
    {
        var authStub = new AuthorizationStub_SetCurrentUserAuthenticated(service, true);

        LoginUser u = authStub.GetCurrentUser();
        Assert.That(u != null);
    }

    [TearDown]
    public void TearDown()
    {
        service = null;
        test = null;
    }
}

それはおそらくインターフェースの過負荷と関係があるのでしょうか?

public interface IMembershipService
{
    bool ChangePassword(string username, string oldPassword, string newPassword);
    LoginUser GetUser(string username);
    LoginUser GetUser(object providerUserKey);
    string ResetPassword(string username);
    bool ValidateUser(string username, string password);
}

テスト対象のメソッドで問題を引き起こしている行は次のとおりです。

LoginUser currentUser = _repository.GetUser(identity.Name);

デバッグモードでは、identity.Nameがnullになることはなく、常に「dummyName」になります。

4

1 に答える 1

3

2番目の方法は新しいAAA構文であり、推奨される方法です。おそらく、AAA構文を使用して発生した問題を拡張し、その問題の修正に役立つ可能性があります。

編集:

メソッドがそのパラメーターで呼び出されていることを確認しますか?使用するとどうなりますか

 service.Stub(r => r.GetUser(Arg<String>.Is.Anything)).Return(new LoginUser());

何か返されますか?

単にスタブするのではなく、期待値を設定してから期待値を検証すると、さらに多くの情報が得られるでしょうか。

service.Expect(r => r.GetUser(Arg<String>.Is.Anything)).Return(new LoginUser());
service.VerifyAllExpectations();

EDIT2:

少しテストを行いましたが、それがスタブオブジェクトを作成する方法のようです。私はあなたが使用している方法が古いスタイルのためであり、あなたが新しいスタイルのためにこれを使う必要があると思います:

service = MockRepository.GenerateStub<IMembershipService>();

これに変更すると、テストを実行して合格させることができます。MockRepository静的メソッドを使用してスタブを生成することと、テストインスタンスを使用することの正確な違いはわかりません。多分誰か他の人がそれの内外を説明することができます。

とにかく完全を期すために、ここで実行したコードは機能しました。

[TestFixture]
public class AuthorizationTest
    {
    private IMembershipService service;

    [SetUp]
    public void SetUp()
        {
        service = MockRepository.GenerateStub<IMembershipService>();
        service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser()); 
        }

    [Test]
    public void GetCurrentUser_UserIsAuthenticated_ReturnsCurrentUser()
        {
        var authStub = new AuthorizationStub_SetCurrentUserAuthenticated(service, true);

        LoginUser u = authStub.GetCurrentUser();
        Assert.That(u != null);
        }

    [TearDown]
    public void TearDown()
        {
        service = null;
        }
    }

public class AuthorizationStub_SetCurrentUserAuthenticated
    {
    private readonly IMembershipService m_service;
    private readonly bool m_b;

    public AuthorizationStub_SetCurrentUserAuthenticated (IMembershipService service, bool b)
        {
        m_service = service;
        m_b = b;
        }

    public LoginUser GetCurrentUser ()
        {
        return m_service.GetUser ("dummyName");
        }
    }

public interface IMembershipService
    {
    bool ChangePassword(string username, string oldPassword, string newPassword);
    LoginUser GetUser(string username);
    LoginUser GetUser(object providerUserKey);
    string ResetPassword(string username);
    bool ValidateUser(string username, string password);
    }

public class LoginUser
    {
    }
于 2010-05-26T10:13:05.770 に答える