Ivo*_*Ivo 5 unit-testing rhino-mocks mocking
我模拟了数据访问层的几种方法,但在某些方法中,设置了SQL输出参数的值.我怎么嘲笑这个?
方法:
Run Code Online (Sandbox Code Playgroud)var wrappedParameters = new SqlParameter[3]; wrappedParameters[0] = new SqlParameter("@username",username); wrappedParameters[1] = new SqlParameter("@password",password); wrappedParameters[2] = new SqlParameter("returnValue",SqlDbType.Int) { Direction =ParameterDirection.ReturnValue }; dal.ExecuteUsingStoredProcedure("GetUser", wrappedParameters);
模拟(我尝试使用"OutRef",但这不起作用):
Run Code Online (Sandbox Code Playgroud)using (mocks.Record()) { Expect.Call(dal.ExecuteUsingStoredProcedure("",> null)).Return(true).IgnoreArguments().OutRef(1); }
但那没有用.当我执行SP GetUser时,设置了param返回值,但我不知道如何模拟它
我认为你处理这个问题的方式是错误的。您的 DAL 界面应如下所示:
/// <summary>
/// Models a service which holds the user information.
/// </summary>
public interface IUserRepository
{
/// <summary>
/// Gets the user with the given name, or <c>null</c> if no user with
/// that name and password exists.
/// </summary>
/// <exception cref="IOException">
/// An I/O problem occurred while accessing the repository.
/// </exception>
User TryGetUser(string name, string password);
}
Run Code Online (Sandbox Code Playgroud)
DAL 抽象现在隐藏了使用存储过程的事实。事实上,DAL 甚至可能不是数据库:它可以是磁盘上的文本文件、Web 服务、模拟或其他任何东西。
现在,为了测试使用 DAL 的代码而模拟 DAL 变得微不足道。在这些示例中,我选择了登录屏幕的视图模型(也称为演示模型)作为测试系统:
[Test]
public void Login_sets_user_and_goes_to_main_screen_when_TryGetUser_not_null()
{
var userRepositoryStub = MockRepository.GenerateStub<IUserRepository>();
var user = new User(...);
userRepositoryStub.Stub(x=>x.GetUserByName("foo","bar")).Return(user);
var sessionStub = MockRepository.GenerateStub<ISession>();
var loginScreenViewModel =
new LoginScreenViewModel(sessionStub, userRepositoryStub);
loginScreenViewModel.UserName = "foo";
loginScreenViewModel.Password = "bar";
loginScreenViewModel.Login();
userRepositoryStub.AssertWasCalled(x=>x.TryGetUser("foo","bar"));
sessionStub.AssertWasCalled(x=>x.ShowMainScreen());
Assert.AreEqual(user, session.User);
}
Run Code Online (Sandbox Code Playgroud)
。
[Test]
public void Login_shows_error_when_TryGetUser_returns_null()
{
var userRepositoryStub = MockRepository.GenerateStub<IUserRepository>();
var sessionStub = MockRepository.GenerateStub<ISession>();
var loginScreenViewModel =
new LoginScreenViewModel(sessionStub, userRepositoryStub);
loginScreenViewModel.UserName = "foo";
loginScreenViewModel.Password = "bar";
loginScreenViewModel.Login();
Assert.AreEqual(loginScreenViewModel.Error,
"User 'foo' does not exist or password is incorrect"));
userRepositoryStub.AssertWasCalled(x=>x.TryGetUser("foo","bar"));
sessionStub.AssertWasNotCalled(x=>x.ShowMainScreen());
Assert.IsNull(session.User);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1696 次 |
最近记录: |