如何在不触及数据库的情况下进行单元测试

本文关键字:情况下 单元测试 数据库 | 更新日期: 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>并将其传递给构造函数。在此对象上设置MeetingsCommittees属性以返回各种集合。

应该设置不同的测试,返回不同的集合。例如,如果MeetingsCommittees都是空的,即数据库中没有数据,这应该如何表现?如果没有提供InterimIdentifier的对象,它应该如何表现?如果有一个匹配的呢

我想出了如何使用test double来做到这一点。我使用实体框架6与代码第一模型。我创建了一个继承自I-DbContext接口的DbContext。然后,我就可以在内存中创建用于服务层单元测试的数据了。下面是一个例子:

  1. 测试数据上下文,
  2. test dbset,
  3. 是一个单元测试示例。

这个解决方案可以从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或任何其他您喜欢的库

相关文章: