2013-02-27 1 views
4

Je rencontre un problème lorsque moq ou Ploeh.AutoFixture.AutoMoq se moquent de toutes les interfaces enfants quand dans un cas je veux que l'un d'eux soit nul.Arrêter les enfants se moquant de Moq/AutoFixture

J'utilise NPOC et il dispose d'une interface appelée IDatabase

public interface IDatabase : IDatabaseQuery 
    { 
     IDbConnection Connection { get; } 
     IDbTransaction Transaction { get; } 

     void AbortTransaction(); 
     void BeginTransaction(); 
     void BeginTransaction(IsolationLevel? isolationLevel); 
     void CompleteTransaction(); 
     IDataParameter CreateParameter(); 
     int Delete(object poco); 
     int Delete<T>(object pocoOrPrimaryKey); 
     int Delete<T>(Sql sql); 
     int Delete<T>(string sql, params object[] args); 
     int Delete(string tableName, string primaryKeyName, object poco); 
     int Delete(string tableName, string primaryKeyName, object poco, object primaryKeyValue); 
     void Dispose(); 
     Transaction GetTransaction(); 
     Transaction GetTransaction(IsolationLevel? isolationLevel); 
     object Insert(object poco); 
     object Insert(string tableName, string primaryKeyName, object poco); 
     object Insert(string tableName, string primaryKeyName, bool autoIncrement, object poco); 
     void Save(object poco); 
     void Save(string tableName, string primaryKeyName, object poco); 
     IDatabase SetTransaction(IDbTransaction tran); 
     int Update(object poco); 
     int Update<T>(Sql sql); 
     int Update(object poco, IEnumerable<string> columns); 
     int Update(object poco, object primaryKeyValue); 
     int Update<T>(string sql, params object[] args); 
     int Update(object poco, object primaryKeyValue, IEnumerable<string> columns); 
     int Update(string tableName, string primaryKeyName, object poco); 
     int Update(string tableName, string primaryKeyName, object poco, IEnumerable<string> columns); 
     int Update(string tableName, string primaryKeyName, object poco, object primaryKeyValue); 
     int Update(string tableName, string primaryKeyName, object poco, object primaryKeyValue, IEnumerable<string> columns); 
    } 

Je ne veux pas IDbTransaction Transaction { get; } à moquaient que je veux que ce soit nul, mais il devient moquaient.

J'ai alors aussi un IUnitOfWork qui a l'interface IDatabase dedans.

public interface IUnitOfWork : IDisposable 
    { 
     void Commit(); 
     IDatabase Db { get; } 
     void SetOneTimeCommandTimeout(int timeout); 
     void SetGlobalCommandTimeout(int timeout); 
     void BeginTransaction(); 

    } 

// Code

fixture = new Fixture().Customize(new AutoMoqCustomization()); 
fixture.Freeze<Mock<IDatabase>>(); 
var test = fixture.CreateAnonymous<MyService>(); 

Depuis la transaction est une propriété en lecture seule, je ne sais pas comment le configurer recommence à zéro.

+2

... C'est .... très .... graisse interface. Vous êtes sûr que vous ne pouvez pas simplifier un peu ce mauvais garçon? –

+0

Pas mon code. C'est de NPoc qu'est-ce qu'un ORM. Donc non, je ne veux vraiment pas le toucher. – chobo2

Répondre

4

Essayez

fixture = new Fixture().Customize(new AutoMoqCustomization()); 
    var mock = fixture.Freeze<Mock<IDatabase>>(); 
    mock.SetupGet(o => o.Transaction).Returns((IDbTransaction)null); 
    var test = fixture.CreateAnonymous<MyService>(); 
+0

hmm pas sûr ne semblait pas fonctionner. Comme il est réglé sur null, mais quand j'utilise réellement "test.MyMethod" et que j'entre dans cette méthode et que je regarde la Transaction, tout d'un coup, il se moque à nouveau. J'ai édité mon article ajouté et ajouté un morceau de code qui peut ou ne peut pas aider. – chobo2

+0

@ chobo2 est MyService utilisant IDatabase ou IUnitOfWork? – MerickOWA

+0

Je me suis rendu compte que je devais "configurer" manuellement la méthode qui retourne l'unitofWork pour renvoyer l'unitOfWork qui avait la base de données mockée qui avait la transaction nulle. – chobo2

Questions connexes