我正在尝试进行一些单元测试,并且我需要虚拟数据。我需要某些数据具有特定的值,而其他则只是随机的。
例如,我的服务层中有一个“ CreateProduct”方法,我想知道使用这种方法而不是在单元测试中手动制作产品是否是一个好主意。
从表面上看,这似乎是一个好主意,但我担心也许我需要嘲笑或成功地通过该方法进行操作。
CreateProduct将尝试将产品保存到数据库,但是我已经有一个标志,该标志将停止保存操作(用于工作单元场景,以防回滚)。
我正在使用EF 6-rc1并使用moq来模拟DataContext,我打算使用AutoFixture,但在此secnario中它不是开箱即用的,我开始感到自己正在使用太多新工具,所以也许我现在应该手动进行。
没有代码示例很难确切地知道您在做什么,但有时我会使用内存中使用an的此实现。典型用法如下:IDataSet
List
using System.Data.Entity;
using System.Linq;
using Moq;
using NUnit.Framework;
namespace EFMock
{
internal interface IDataContext
{
IDbSet<DataItem> DataItems { get; set; }
}
class DataContext : DbContext, IDataContext
{
public IDbSet<DataItem> DataItems{ get; set; }
}
class DataItem
{
public int SomeNumber { get; set; }
public string SomeString { get; set; }
}
/* ----------- */
class DataUsage
{
public int DoSomething(IDataContext dataContext)
{
return dataContext.DataItems.Sum(x => x.SomeNumber);
}
}
/* ----------- */
[TestFixture]
class TestClass
{
[Test]
public void SomeTest()
{
var fakeDataItems = new [] {
new DataItem { SomeNumber = 1, SomeString = "One" },
new DataItem { SomeNumber = 2, SomeString = "Two" }};
var mockDataContext = new Mock<IDataContext>();
mockDataContext.SetupGet(x => x.DataItems).Returns(new FakeDbSet<DataItem>(fakeDataItems));
var dataUsage = new DataUsage();
var result = dataUsage.DoSomething(mockDataContext.Object);
Assert.AreEqual(2, result);
}
}
}
我还有一个名为“ FakeO”的NuGet包,可用于创建一些伪造的对象,其中某些数据是特定值,而某些则是随机的:
var fakeDataItems = FakeO.Create.Fake<DataItem>(10, // create an IEnumerable of 10 items
x => x.SomeNumber = FakeO.Number.Next(), // set to a random number
x => x.SomeString = "Always This String"); // set to a specific string
这种测试要记住的一件事是,IQueryable
对aList
使用a会使用Linq2Objects而不是Linq2Entities,因此某些Linq查询的结果将有所不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句