我是TDD开发新手,刚刚开始做一些测试,包括Nunit 3.7.1,Newtonsoft.Json版本= 10.0.3,JustMock Lite版本2016.2.426.1,C#和.NET Framework 4.7。如何模拟一个IGenericRepository
我想测试这个类:
public class LoadFinishedTrzlBatch
{
private IGenericRepository<ProductionOrder> proOrdRepository;
private IGenericRepository<Batch> batchRepository;
private IGenericRepository<Code> codeRepository;
private IGenericRepository<Aggregation> aggregationRepository;
private IGenericRepository<AggregationChildren> aggChildrenRepository;
public LoadFinishedTrzlBatch(
IGenericRepository<ProductionOrder> proOrdRepository,
IGenericRepository<Batch> batchRepository,
IGenericRepository<Code> codeRepository,
IGenericRepository<Aggregation> aggregationRepository,
IGenericRepository<AggregationChildren> aggChildrenRepository)
{
this.proOrdRepository = proOrdRepository;
this.batchRepository = batchRepository;
this.codeRepository = codeRepository;
this.aggregationRepository = aggregationRepository;
this.aggChildrenRepository = aggChildrenRepository;
}
public bool ExistsProductionOrder(string productionOrderName)
{
if (string.IsNullOrWhiteSpace(productionOrderName))
throw new ArgumentNullException(nameof(productionOrderName));
return (
proOrdRepository
.SearchFor(p => p.Name == productionOrderName)
.FirstOrDefault() != null
);
}
}
有了这个测试:
[TestFixture]
class LoadFinishedTrzlBatchTest
{
private LoadFinishedTrzlBatch _load;
[SetUp]
public void SetUpLoadFinishedTrzlBatch()
{
var proOrdRepository =
Mock.Create<IGenericRepository<ProductionOrder>>();
var batchRepository =
Mock.Create<IGenericRepository<Batch>>();
var codeRepository =
Mock.Create<IGenericRepository<Code>>();
var aggRepository =
Mock.Create<IGenericRepository<Aggregation>>();
var aggChildrenRepository =
Mock.Create<IGenericRepository<AggregationChildren>>();
_load = new LoadFinishedTrzlBatch(
proOrdRepository,
batchRepository,
codeRepository,
aggRepository,
aggChildrenRepository);
}
[Test]
public void ShouldExistsProductionOrder()
{
// Arrange
Mock.Arrange(() => _load.ExistsProductionOrder("ProOrd"))
.Returns(true)
.MustBeCalled();
// Act
var actual = _load.ExistsProductionOrder("ProOrd");
// Assert
Assert.AreEqual(actual, true);
}
}
最后这是IGenericRepository
:
public interface IGenericRepository<TEntity>
{
[ OMITTED ]
IQueryable<TEntity> SearchFor(Expression<Func<TEntity, bool>> predicate);
[ OMITTED ]
}
首先,我不知道如果这是测试方法LoadFinishedTrzlBatch.ExistsProductionOrder
的正确方法。 TDD对我来说都是新事物,我迷失了方向。我很困惑我如何嘲笑IGenericRepository<ProductionOrder>
。它总是如此,我不测试IGenericRepository<ProductionOrder>
。也许是因为我没有测试版本库。
我在学习,我不知道我在做什么。这就是我问这个问题的原因。我想测试ExistsProductionOrder
方法。
我该如何测试ExistsProductionOrder
方法?
这不是真的很清楚你实际上试图在这里测试。如果你正在测试'ExistsProductionOrder'方法,那么你为什么要嘲笑它呢? – DavidG
因为我在学习,我不知道我在做什么。这就是我问这个问题的原因。我想测试'ExistsProductionOrder'方法。 – VansFannel
然后,您应该以原始形式(即未嘲笑)调用它,并且只嘲笑依赖关系,特别是那些相关依赖关系的任何方法。 – DavidG