メソッドに偽の実装を与えるための次の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」になります。