2015-08-18 2 views
1

Я использую FakeItEasy как издевательскую структуру в своих модульных тестах. Метод fakeUserService.AddUser издевались для возвращенного нового объекта MwbeUser с некоторыми непустых значений внутри метода AddUserFakeItEasy: издевавшийся метод не возвращает ожидаемый результат

A.CallTo(() => fakeUserService.AddUser(new MwbeUserRegistrationIn() 
              { 
               UserName = userName,                
               FirstName = firstName, 
               SecondName = secondName, 
               Password = passwd, 
               Email = email, 
               BirthDate = birthdate 
              })).Returns(new MwbeUser 
                  { 
                   UserName = userName, 
                   Email = email, 
                   FirstName = firstName, 
                   SecondName = secondName, 
                   BirthDate = birthdate 
                  }); 

но он возвращает аннулирует. Зачем?

public void AddUserWithProperdata_UserIsAddedAndEmailIsGenerated() 
     { 
      // Arrange 
      String userName = "user"; 
      String firstName = "Ala"; 
      String secondName = "ADsadas"; 
      String passwd = "passwd"; 
      String email = "[email protected]"; 
      DateTime birthdate = DateTime.Today; 

      fakeUserService = A.Fake<IMwbeUserService>(); 
      fakeAuthenticationService = A.Fake<IAuthenticationService>(); 

      A.CallTo(() => fakeUserService 
       .AddUser(new MwbeUserRegistrationIn() { UserName = userName, FirstName = firstName, SecondName = secondName, Password = passwd, Email = email, BirthDate = birthdate })) 
       .Returns(new MwbeUser { UserName = userName, Email = email, FirstName = firstName, SecondName = secondName, BirthDate = birthdate }); 

      MwbeUsersController controller = new MwbeUsersController(fakeUserService, fakeAuthenticationService); 

      MwbeUserRegistrationJson userjson = new MwbeUserRegistrationJson 
      { 
       username = userName, 
       passwd = passwd, 
       firstname = firstName, 
       secondname = secondName, 
       email = email, 
       birthdate = birthdate 
      }; 

      // Act 
      IHttpActionResult untypedResult = controller.AddUser(userjson); 
      var test1 = untypedResult as OkResult; 
      var test2 = untypedResult as CreatedNegotiatedContentResult<MwbeUser>; 

      // Assert 
      Assert.IsNotNull(untypedResult); 
     } 



    public interface IMwbeUserService 
     { 
      MwbeUser AddUser(MwbeUserRegistrationIn regData); 
... 
} 

UPDATE 1: добавлен код контроллера

[RoutePrefix("users")] 
    public class MwbeUsersController : ApiController 
    { 
     IMwbeUserService userSrv; 
     IAuthenticationService authService; 


     public MwbeUsersController(IMwbeUserService service, IAuthenticationService authSrv) 
     { 
      this.userSrv = service; 
      this.authService = authSrv; 
     } 

... 

    [Route("register")] 
      [HttpPost] 
      public IHttpActionResult AddUser(MwbeUserRegistrationJson userdatadto) 
      { 
       // Validation 
       if (null == userdatadto) 
       { 
        return BadRequest("No user data"); 
       } 

       if (!ModelState.IsValid) 
       { 
        return BadRequest(ModelState); 
       } 

       var registrationData = Conversion.ToUser(userdatadto); 
       if(registrationData.Code != MwbeResponseCodes.OK) 
       { 
        return BadRequest(registrationData.ErrorMessage); 
       } 

       // Registration 
       try 
       { 
        MwbeUser createdUser = userSrv.AddUser(registrationData.Data); 
        return Created<MwbeUser>("https://stackoverflow.com/users/" + createdUser.Id, createdUser); 
       } 
       catch (UserAlreadyExistsException) 
       { 
        return BadRequest("User with this username already exists"); 
       } 
       catch (InvalidEmailAddress) 
       { 
        return BadRequest("Given e-mail address is invalid"); 
       } 

      } 

ответ

4

У меня есть небольшой опыт работы с FakeItEasy, но я думаю, что ваши ожидания слишком строги.

Ожидание на AddUser будет соответствовать только если он вызывается с объектом, который считается равным (как если бы при использовании object.Equals(object, object)

Поскольку контроллер переходит в другой объект MwbeUserRegistrationIn (registrationData):.

.AddUser(new MwbeUserRegistrationIn() { 
    UserName = userName, 
    FirstName = firstName, 
    SecondName = secondName, 
    Password = passwd, 
    Email = email, 
    BirthDate = birthdate })) 

и MwbeUserRegistrationIn предположительно не отменяет object.Equals(object), это ожидание не будет срабатывать. Вы можете реализовать MwbeUserRegistrationIn.Equals(object) с семантикой на основе стоимости или расслабить ожидания, что называется argument constraints.

В вашем случае, вы можете переписать ожидание немного:

A.CallTo(() => fakeUserService.AddUser(A<MwbeUserRegistrationIn>.That.Matches(u => 
    u.UserName == userName && 
    u.FirstName == firstName && 
    u.SecondName == secondName && 
    u.Password == passwd && 
    u.Email == email && 
    u.BirthDate == birthdate))) 
    .Returns(new MwbeUser 
    { 
     UserName = userName, 
     Email = email, 
     FirstName = firstName, 
     SecondName = secondName, 
     BirthDate = birthdate 
    }); 
+0

Хороший вопрос ... Im пытается реализовать :). –

+0

Вы можете написать полную команду? A.CallTo (() .....? –

+0

Это дает 34 ошибки :) –

Смежные вопросы