我是新來模擬和使用Moq。這是我第一次嘗試模擬添加功能。我有模擬設置,它適用於讀取功能,但是當我嘗試單元測試一個添加方法時,它將更改保存到數據庫。我的Mocked DbContext使用Moq在單元測試中寫入數據庫
如何模擬添加方法?
我想我有嘲笑我UnitOfWork
類有SaveChanges()
方法。我想知道如何設置模擬攔截SaveChanges()
的呼叫,而不是保存到分貝。
這裏是嘲笑我到目前爲止
[SetUp]
public void SetUp()
{
addCount = 0;
IEnumerable<Platform> platformList = new List<Platform>(){
new Platform() { Id = 1, Name = "Unknown"},
new Platform() { Id =2, Name = "Amazon"},
new Platform() { Id = 3, Name = "Prime Pantry"}
};
var platformData = platformList.AsQueryable();
var mockPlatformSet = new Mock<DbSet<Platform>>();
mockPlatformSet.As<IQueryable<Platform>>().Setup(m => m.Provider).Returns(platformData.Provider);
mockPlatformSet.As<IQueryable<Platform>>().Setup(m => m.Expression).Returns(platformData.Expression);
mockPlatformSet.As<IQueryable<Platform>>().Setup(m => m.ElementType).Returns(platformData.ElementType);
mockPlatformSet.As<IQueryable<Platform>>().Setup(m => m.GetEnumerator()).Returns(platformData.GetEnumerator());
mockPlatformSet.Setup(m => m.Add(It.IsAny<Platform>())).Callback(() => addCount++);
var mockContext = new Mock<ApplicationDbContext>(){ CallBase = true };
mockContext.Setup(m => m.Platforms).Returns(mockPlatformSet.Object);
mockContext.Setup(m => m.Platforms.Add(It.IsAny<Platform>()));
mockContext.Setup(m => m.Platforms.Add(It.IsAny<Platform>())).Callback(() => addCount++);
unitOfWork = new UnitOfWork(mockContext.Object);
platformRepo = new PlatformRepository(mockContext.Object);
controller = new PlatformController(platformRepo, unitOfWork);
}
添加的UnitOfWork代碼
public class UnitOfWork : IUnitOfWork
{
private readonly DbContext _context;
private bool _isDisposed = false;
public UnitOfWork(DbContext context)
{
_context = context;
}
public void SaveChanges()
{
_context.SaveChanges();
}
protected virtual void Dispose(bool disposing)
{
if (!_isDisposed)
{
if (disposing)
{
_context.Dispose();
}
}
_isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
更新問題
我試圖單元測試我的Create
方法我PlatformController
。在這種方法中,我調用Add
函數,然後SaveChanges
函數UnitOfWork
。我想驗證我的Platform
對象被添加到DbSet中,但是「截取」SaveChanges()
的調用,以致它不寫入數據庫。
我該怎麼做?
當我試圖做嘲諷的代碼,我嘲笑上下文集合來代替。 – Ian 2014-10-10 15:36:59
您可以添加上下文被注入的'UnitOfWork'構造函數的代碼嗎? – elolos 2014-10-10 15:47:26
@elolos我添加了UnitOfWork代碼 – DFord 2014-10-10 15:50:04