moq의 속성에 값을 할당하는 방법은 무엇입니까?
유형의 객체를 반환하는 메서드가있는 클래스가 있습니다. 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
도메인 개체입니다. 음 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'는 사용자를 생성, 사용자는 모의가 작성 반환합니다;
[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);
}
문제는 이메일, 이름, 비밀번호가 비어 있다는 것입니다 (기본값)!
The way you prepare the mocked user is the problem.
moqUser.Object.Name = username;
will not set the name, unless you have setup the mock properly. Try this before assigning values to properties:
moqUser.SetupAllProperties();
This method will prepare all properties on the mock to be able to record the assigned value, and replay it later (i.e. to act as real property).
You can also use SetupProperty() method to set up individual properties to be able to record the passed in value.
Another approach is:
var mockUser = Mock.Of<User>( m =>
m.Name == "whatever" &&
m.Email == "someone@example.com");
return mockUser;
I think you are missing purpose of mocking. Mocks used to mock dependencies of class you are testing:
System under test (SUT) should be tested in isolation (i.e. separate from other units). Otherwise errors in dependencies will cause your SUTs tests to fail. Also you should not write tests for mocks. That gives you nothing, because mocks are not production code. Mocks are not executed in your application.
So, you should mock CustomMembershipProvider
only if you are testing some unit, which depends on it (BTW it's better to create some abstraction like interface ICustomMembershipProvider
to depend on).
Or, if you are writing tests for CustomMembershipProvider
class, then it should not be mocked - only dependencies of this provider should be mocked.
ReferenceURL : https://stackoverflow.com/questions/16816551/how-to-assign-values-to-properties-in-moq
'programing' 카테고리의 다른 글
Screenshot UX Trial과 같이 루트 권한없이 프로그래밍 방식으로 다른 앱의 스크린 샷을 찍는 방법은 무엇입니까? (0) | 2021.01.18 |
---|---|
최신 버전의 Android를 타겟팅하지 않음 (0) | 2021.01.18 |
nginx 프록시 서버에서 요청 헤더 전달 (0) | 2021.01.18 |
Intent.FLAG_ACTIVITY_CLEAR_TASK와 Intent.FLAG_ACTIVITY_TASK_ON_HOME의 차이점 (0) | 2021.01.18 |
Jenkins 콘솔 출력에서 에코 끄기 (0) | 2021.01.18 |