我正在使用爲數據庫調用方法附帶IDatabase類的NPoco。我想驗證進入NPoco Insert方法的對象是否具有正確的數據(以域對象的形式)。如何在moq中調試驗證?
public interface IUnitOfWorkProvider
{
IUnitOfWork GetUnitOfWork();
}
public interface IUnitOfWork : IDisposable
{
void Commit();
IDatabase Db { get; }
void SetOneTimeCommandTimeout(int timeout);
void SetGlobalCommandTimeout(int timeout);
}
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);
}
// my test class file
private IFixture fixture;
private Mock<IUnitOfWork> unitOfWork;
private MyService myService;
private Mock<IDatabase> database; // new based on responses
[SetUp]
public void Setup()
{
fixture = new Fixture().Customize(new AutoMoqCustomization());
database = fixture.Freeze<Mock<IDatabase>>();// new based on responses
unitOfWork = fixture.Freeze<Mock<IUnitOfWork>>();
myService = fixture.CreateAnonymous<MyService>();
}
[Test]
public MyTest()
{
// fails
unitOfWork.Setup(x => x.Db.Insert(It.IsAny<MyDomainObject>()));
myService.CallMyMethod();
unitOfWork.Verify(x => x.Db.Insert(It.IsAny<MyDomainObject>()));
// fails
unitOfWork.Setup(x => x.Db.Insert(It.IsAny<object>()));
myService.CallMyMethod();
unitOfWork.Verify(x => x.Db.Insert(It.IsAny<object>()));
// fails (this was a try based on responses)
database.Setup(x => x.Insert(It.IsAny<object>()));
myService.CallMyMethod();
database.Verify(x => x.Insert(It.IsAny<object>()));
// passes
unitOfWork.Setup(x => x.Db.Insert(It.IsAny<object>()));
myService.CallMyMethod();
unitOfWork.Verify();
}
public class MyDomainObject
{
public void Id {get; set;}
}
的代碼被稱爲(我應該觸發驗證)
using (var unitOfWork = unitOfWorkProvider.GetUnitOfWork())
{
MyDomainObject myDomain = anotherService.getMyDomain(DateTime.Now, 100);
unitOfWork.Db.Insert(myDomain);
}
你的設置不從我所能看到的嘲笑 - 也就是說你可以做'x.Db',但是當你點到另一個關卡時,你不在Setup表達式可以做的事情上 - 這一點被'Verify( )'的作品[因爲你是呼號'x.Db']。但也許你已經剝去了太多。 –
我會更新我的帖子。 – chobo2
就像Ruben懷疑的那樣,'IDatabase Db'得到*自動模擬*,並且您對錯誤的對象設置了期望值。通常,在執行'x => x.Db ...'位('Db'爲空)時,您會得到空引用異常,但是由於您使用了AutoFixture,因此它會靜默地通過。你最後一個例子的作用只是因爲對'unitOfWork'完全沒有期望。我建議你'凍結''IDatabase'並設置它的期望值。 –