Пожалуйста, прости меня заранее, я пытаюсь научиться юнит-тестированию и Moq.
Я думаю, что мне почти удалось все настроить правильно (но я могу ошибаться).Когда я выполняю тест, описанный ниже, я получаю следующую ошибку:
Невозможно преобразовать из TestMoq.DAL.IGenericRepository в TestMoq.DAL.GenericRepository TestMoq.UnitTests
В этой строке:
_mockUnitWork.Setup(m => m.CreditRepository).Returns(_mockRepository.Object);
Вот мой код:
MoqTest
using System;
using NUnit.Framework;
using TestMoq.Controllers;
using TestMoq.Models;
using TestMoq.DAL;
using Moq;
using System.Web.Mvc;
using System.Runtime;
using System.Data.Entity;
using System.Collections.Generic;
using System.Linq;
namespace TestMoq.UnitTests.Controllers
{
[TestFixture]
public class BaseControllerTests
{
private Mock<IGenericRepository<Credit>> _mockRepository;
Mock<IUnitOfWork> _mockUnitWork;
[Test]
public void MoqTest() {
_mockRepository = new Mock<IGenericRepository<Credit>>();
_mockUnitWork = new Mock<IUnitOfWork>();
var _service = new CreditsController(_mockUnitWork.Object);
List<Credit> listCredit= new List<Credit>() {
new Credit() { CreditId = 1},
new Credit() { CreditId = 2},
new Credit() { CreditId = 3 }
};
_mockRepository.Setup(x => x.Get(null, null, "*")).Returns(listCredit);
_mockUnitWork.Setup(m => m.CreditRepository).Returns(_mockRepository.Object);
List<Credit> results = _service.GetAll() as List<Credit>;
Assert.IsNotNull(results);
Assert.AreEqual(3, results.Count);
}
}
}
CreditController.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using TestMoq.CustomFilters;
using TestMoq.DAL;
using TestMoq.Models;
namespace TestMoq.Controllers
{
public class CreditsController : Controller
{
private UnitOfWork unitOfWork = new UnitOfWork();
private IUnitOfWork _unitOfWork;
public CreditsController()
{
this._unitOfWork = new UnitOfWork();
}
public CreditsController(IUnitOfWork _NewUnitOfWork)
{
this._unitOfWork = _NewUnitOfWork;
}
public List<Credit> GetAll()
{
return _unitOfWork.CreditRepository.Get().ToList();
}
}
}
GenericRepository
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Web;
using TestMoq.Models;
namespace TestMoq.DAL
{
public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
{
internal TcpContext context;
internal DbSet<TEntity> dbSet;
public GenericRepository(TcpContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
public virtual TEntity GetByID(object id)
{
return dbSet.Find(id);
}
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
public virtual void Delete(object id)
{
TEntity entityToDelete = dbSet.Find(id);
Delete(entityToDelete);
}
public virtual void Delete(TEntity entityToDelete)
{
if (context.Entry(entityToDelete).State == EntityState.Detached)
{
dbSet.Attach(entityToDelete);
}
dbSet.Remove(entityToDelete);
}
public virtual void Update(TEntity entityToUpdate)
{
dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
}
IGenericRepository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace TestMoq.DAL
{
public interface IGenericRepository<TEntity> where TEntity : class
{
void Delete(object id);
void Delete(TEntity entityToDelete);
IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "");
TEntity GetByID(object id);
void Insert(TEntity entity);
void Update(TEntity entityToUpdate);
}
}
UnitOfWork
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TestMoq.Models;
namespace TestMoq.DAL
{
public class UnitOfWork : IDisposable, IUnitOfWork
{
private TcpContext context = new TcpContext();
public GenericRepository<Credit> creditRepository;
//Other models & methods removed for clarity
public GenericRepository<Credit> CreditRepository
{
get
{
if (this.creditRepository == null)
{
this.creditRepository = new GenericRepository<Credit>(context);
}
return creditRepository;
}
}
public void Save()
{
context.SaveChanges();
}
}
}
IUnitOfWork.cs
using TestMoq.Models;
namespace TestMoq.DAL
{
public interface IUnitOfWork
{
GenericRepository<Amendment> AmendmentRepository { get; }
GenericRepository<Credit> CreditRepository { get; }
GenericRepository<FileUpload> FileUploadRepository { get; }
GenericRepository<Job> JobRepository { get; }
GenericRepository<Subscription> SubscriptionRepository { get; }
GenericRepository<Topic> TopicRepository { get; }
GenericRepository<Writer> WriterRepository { get; }
void Dispose();
void Save();
}
}
Заранее извиняюсь, если я полностью облажалсяЕсли вы заметили какие-либо другие серьезные ошибки в моем мышлении (я все еще разбираюсь в этом), пожалуйста, укажите мне на них.
Спасибо!