我正在尝试对这个简单的方法进行单元测试,虽然我不确定如何使用moq来删除where子句?虽然我努力让它发挥作用,但我已经尝试了以下内容!?
我想测试Get()方法返回Person列表。
谢谢,
我的测试
[Test]
public void TempTest()
{
// Arrange
var list = new List<string> {"Key"};
var mockRepository = new Mock<IBRepository>();
var bService = new BService(mockRepository.Object);
// ** I'm not sure about this line **
mockRepository.Setup(x => x.Where...);
// Act
var result = bService.Get(list);
// Assert
}
测试方法
private readonly IBRepository _repository;
public List<MyClass> Get(List<string> list)
{
var collection = new List<MyClass>();
foreach (var key in list)
{
var id = key;
collection.AddRange(_repository.Where(x => x.SomeProperty.Equals(id)));
}
return list;
}
IBRepository
public interface IBRepository : IRepository<B, int>
{
}
BRepository
public class BRepository : Repository<B, int>, IBRepository, IUnitOfWorkRepository
{
public BRepository(NHUnitOfWork<UserMapping> uow)
: base(uow)
{
}
}
IRepository
public interface IRepository<T, TId> : INoIdRepository<T>, IReadOnlyRepository<T, TId> where T : IAggregateRoot
{
TId Insert(T entity);
bool TryInsert(T entity, out TId entityId);
void DeleteById(TId id);
void DeleteByIds(IList<TId> ids);
}
功能
IEnumerable<T> Where(Expression<Func<T, bool>> predicate);
答案 0 :(得分:0)
我认为您从存储库界面泄漏了一些实现细节。如果将查询移动到存储库实现,那么您的设计将更加可测试。我就是这样做的:
interface IBRepository
{
List<MyClass> Get(List<string> idList);
}
使用此接口,您不必将谓词发送到接口或尝试模拟LINQ方法(无论如何都不能模拟它们,因为它们是扩展方法)。
我猜你有一个你想要使用的通用存储库接口。 IMHO通用存储库接口不是很有用,您可以通过继承通用存储库实现来使用通用功能。这使得模拟存储库非常简单:
[Test]
public void TempTest()
{
// Arrange
var list = new List<string> {"Key"};
var mockRepository = new Mock<IBRepository>();
var bService = new BService(mockRepository.Object);
mockRepository.Setup(x => x.Get(list)).Returns(new List<MyClass>());
// Act
var result = bService.Get(list);
// Assert
}