【发布时间】:2013-05-24 20:53:38
【问题描述】:
我有一个类,其方法返回User 类型的对象
public class CustomMembershipProvider : MembershipProvider
{
public virtual User GetUser(string username, string password, string email, bool isApproved)
{
return new User()
{
Name = username
,Password = EncodePassword(password)
,Email = email
,Status = (isApproved ? UsuarioStatusEnum.Ativo : UsuarioStatusEnum.ConfirmacaoPendente)
// ...
};
}
// ..
}
User 是一个域对象。注意带有 setter as protected 的 Id 属性:
public class User : IAuditable, IUser
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
public virtual string Email { get; set; }
public virtual UsuarioStatusEnum Status { get; set; }
public virtual string Password { get; set; }
}
Id 受到保护,因为它是由数据库生成的。
测试项目
在我的测试项目中,我有一个带有 Store 方法的 Fake 存储库来保存/更新对象:
public void Store(T obj)
{
if (obj.Id > 0)
_context[obj.Id] = obj;
else
{
var generateId = _context.Values.Any() ? _context.Values.Max(p => p.Id) + 1 : 1;
var stubUser = Mock.Get<T>(obj); // In test, will always mock
stubUser.Setup(s => s.Id).Returns(generateId);
_context.Add(generateId, stubUser.Object);
}
}
在CustomMembershipProvider 中,我有public override MembershipUser CreateUser 方法调用GetUser 来创建User。
这样,我所要做的就是模拟 GetUser 方法,以便存储库可以生成 Id
var membershipMoq = new Mock<CustomMembershipProvider>();
membershipMoq.CallBase = true;
membershipMoq
.Setup(p => p.GetUser(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
.Returns<string, string, string, bool>( (username, password, email, isAproved) => {
var moqUser = new Mock<User>();
moqUser.Object.Name = username;
moqUser.Object.Password = password;
moqUser.Object.Email = email;
moqUser.Object.Status = (isAproved ? UsuarioStatusEnum.Ativo : UsuarioStatusEnum.ConfirmacaoPendente);
return moqUser.Object;
});
_membershipProvider = membershipMoq.Object;
问题
理论上一切都是正确的。当CreateUser调用'GetUser'创建用户时,用户会返回Mockfilled;
[TestMethod]
public void CreateUser_deve_criar_usuario_no_repositorio()
{
// Act
MembershipCreateStatus status;
var usr = _membershipProvider.CreateUser(
_fixture.Create<string>(),
_fixture.Create<string>(),
_fixture.Create<string>(),
null, null, true, null,
out status);
// usr should have name, email password filled. But not!
// Assert
status.Should().Be(MembershipCreateStatus.Success);
}
问题是邮箱、姓名、密码都是空的(有默认值)!
【问题讨论】:
-
你在这里测试哪个类?我只看到周围的嘲笑
-
我正在测试我的
CustomMembershipProvider。status.Should().Be(MembershipCreateStatus.Success);仓库中创建的用户,邮箱、姓名、密码为空。 -
CustomMembershipProvider是您代码中的模拟。您正在测试起订量框架? -
@SergeyBerezovskiy
CustomMembershipProvider是一个模拟,因为他模拟了这个类上的一个方法,但仍然为每个其他方法调用基本实现(因为.CallBase = true)
标签: c# unit-testing mocking moq