In che modo i linguaggi funzionali gestiscono una situazione di scherno quando si utilizza la progettazione basata sull'interfaccia?

3

Tipicamente in C # uso l'injection dependance per aiutare con il mocking;

public void UserService
{
  public UserService(IUserQuery userQuery, IUserCommunicator userCommunicator, IUserValidator userValidator)
  {
    UserQuery = userQuery;
    UserValidator = userValidator;
    UserCommunicator = userCommunicator;
  }

  ...

  public UserResponseModel UpdateAUserName(int userId, string userName)
  {
     var result = UserValidator.ValidateUserName(userName)
     if(result.Success)
     {
       var user = UserQuery.GetUserById(userId);
       if(user == null)
       {
          throw new ArgumentException();
          user.UserName = userName;
          UserCommunicator.UpdateUser(user);
       }
     }
     ...
  }

  ...
}

public class WhenGettingAUser
{
  public void AndTheUserDoesNotExistThrowAnException()
  {
     var userQuery = Substitute.For<IUserQuery>();
     userQuery.GetUserById(Arg.Any<int>).Returns(null);
     var userService = new UserService(userQuery);
     AssertionExtensions.ShouldThrow<ArgumentException>(() => userService.GetUserById(-121));
  }
}

Ora in qualcosa di simile a F #: se non scendo il percorso ibrido, come potrei testare situazioni di workflow come sopra che normalmente toccherebbero il livello di persistenza senza usare Interfaces / Mocks?

Mi rendo conto che ogni passo sopra sarebbe stato testato da solo e sarebbe stato il più atomico possibile. Il problema è che a un certo punto devono essere tutti chiamati in linea, e voglio assicurarmi che tutto venga chiamato correttamente.

    
posta Programmin Tool 25.06.2012 - 21:31
fonte

2 risposte

6

Tipicamente, andrei su questo scrivendo una funzione che restituisce una rappresentazione dell'azione che voglio eseguire sulla risorsa esterna piuttosto che eseguire l'operazione stessa. In questo modo la logica e l'azione dell'IO vengono disaccoppiati e il test è molto più semplice.

    
risposta data 25.06.2012 - 22:12
fonte
2

Nello stesso modo in cui si fa in C #, ma invece di passare la simulazione al costruttore, si passa alla funzione stessa (o come parte di un parametro passato alla funzione).

    
risposta data 25.06.2012 - 22:15
fonte

Leggi altre domande sui tag