如何moq存储库使用moq的位置

时间:2014-01-07 10:02:54

标签: unit-testing moq

我正在尝试对这个简单的方法进行单元测试,虽然我不确定如何使用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);

1 个答案:

答案 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
}