如何在不触及数据库的情况下进行单元测试
本文关键字:情况下 单元测试 数据库 | 更新日期: 2023-09-27 18:13:41
我想问什么是下面方法的良好单元测试GetMeetingsByInterimIdentifier其中临时标识符是字符串-例如78th2015。
我们设置使用接口IMeetingsService。我们使用MOQ和Microsoft.VisualStudio.TestTools.UnitTesting。
public class MeetingsService : IMeetingsService
{
private readonly IInterimCommitteeDbContext _db;
public MeetingsService(IInterimCommitteeDbContext db)
{
this._db = db;
}
public IQueryable<Meeting> GetMeetingsByInterimIdentifier(string interimIdentifier)
{
return
from m in this._db.Meetings
join c in this._db.Committees on m.CommitteeId equals c.CommitteeId
where c.InterimIdentifier == interimIdentifier
select m;
}
public Meeting GetMeeting(int meetingKey)
{
return this._db.Meetings.FirstOrDefault(x => x.MeetingId == meetingKey);
}
}
编辑:但我不确定如何设置它。这个结果不是空的,但是它对我有什么用呢?
[TestMethod]
public void GetMeetingsByInterimIdentifier_WithInterimIdentifier_ReturnsMeetingList()
{
//Arrange
var interim = Properties.Settings.Default.DefaultInterimIdentifier;
var result = _meetingServiceMock.Setup(x => x.GetMeetingsByInterimIdentifier(interim));
//Act
//Assert
Assert.IsNotNull(result);
}
创建Mock<IInterimCommitteeDbContext>
并将其传递给构造函数。在此对象上设置Meetings
和Committees
属性以返回各种集合。
应该设置不同的测试,返回不同的集合。例如,如果Meetings
和Committees
都是空的,即数据库中没有数据,这应该如何表现?如果没有提供InterimIdentifier
的对象,它应该如何表现?如果有一个匹配的呢
我想出了如何使用test double来做到这一点。我使用实体框架6与代码第一模型。我创建了一个继承自I-DbContext接口的DbContext。然后,我就可以在内存中创建用于服务层单元测试的数据了。下面是一个例子:
- 测试数据上下文,
- test dbset,
- 是一个单元测试示例。
这个解决方案可以从msdn的一篇文章中找到:https://msdn.microsoft.com/en-us/data/dn314429.aspx…
<>之前公共类CommitteeContextTest: ICommitteeDbContext{公共CommitteeContextTest (){这一点。Committees = new TestDbSet();这一点。committemembers = new TestDbSet();}公共数据库数据库{获取;}public DbSet Committees {get;设置;}public DbSet committemembers {get;设置;}}}之前<>之前公共类TestDbSet: DbSet, IQueryable, IEnumerable, IDbAsyncEnumerableTEntity: class{ObservableCollection _data;这个IQueryable _query;公共TestDbSet (){_data = new ObservableCollection();_query = _data.AsQueryable();}公共覆盖实体添加(实体项){_data.Add(项);返回项目;}公共覆盖实体删除(实体项){_data.Remove(项);返回项目;}公共覆盖实体附加(实体项){_data.Add(项);返回项目;}创建实体{返回Activator.CreateInstance ();}}(TestClass)公共类CommitteeServiceTest{private InterimCommitteeContextTest _interimCommitteeContext;private ICommitteeService _service;私有字符串_interim;(TestInitialize)public void SetUp(){_interimCommitteeContext = new InterimCommitteeContextTest();_service = new CommitteeService(_interimCommitteeContext);_interim = Settings.Default.DefaultInterimIdentifier;}(TestCleanup)public void Teardown(){_interimCommitteeContext = null;_service = null;}(TestMethod)getcommittee_provideinterimcommitteeid_returnoncommittee (){//安排AddCommittees ();//动作和断言Var result = _service。GetCommittee (_interim, 1);断言。result.CommitteeId AreEqual(1日);//传递。IsActive设置为true;Result = _service。GetCommittee (_interim 0);Assert.IsNull(结果);//失败。No committeeId = 0;Result = _service。GetCommittee (_interim 2);Assert.IsNull(结果);//失败。CommitteeId = 2未激活。}(TestMethod)AddCommittees(){_interimCommitteeContext.Committees。新增(new Committee() {CommitteeId = 1, InterimIdentifier = _interim, IsActive = true, CommitteeTypeId = 1});_interimCommitteeContext.Committees。新增(new Committee() {CommitteeId = 2, InterimIdentifier = _interim, IsActive = false, CommitteeTypeId = 1});_interimCommitteeContext.Committees。新增(new Committee() {CommitteeId = 3, InterimIdentifier = _interim, IsActive = true, CommitteeTypeId = 1});}}使用mock,这就是它的作用。使用JMock或Mockito或任何其他您喜欢的库