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

时间:2015-09-21 16:09:27

标签: c# unit-testing moq mstest

我想问下面方法 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);
} 

3 个答案:

答案 0 :(得分:0)

使用Mocking,它的用途是什么。使用JMockMockito或您喜欢的任何其他库。

答案 1 :(得分:0)

创建一个Mock<IInterimCommitteeDbContext>并将其传递给构造函数。在此对象上设置MeetingsCommittees属性以返回各种集合。

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

答案 2 :(得分:0)

我想出了如何使用测试双打来做到这一点。我正在使用Entity Framework 6和代码第一个模型。我创建了一个继承自I-DbContext接口的DbContext。然后我能够创建内存数据以用于我的服务层单元测试。以下是一个例子:

  1. 测试数据上下文
  2. 测试dbset,
  3. 示例单元测试。
  4. 此解决方案可从以下msdn文章获得: https://msdn.microsoft.com/en-us/data/dn314429.aspx ...

            public class CommitteeContextTest : ICommitteeDbContext
            {
                public CommitteeContextTest()
                {
                    this.Committees = new TestDbSet();
                    this.CommitteeMembers = new TestDbSet();
                }
                public Database Database { get; }
                public DbSet Committees { get; set; }
                public DbSet CommitteeMembers { get; set; }
            }
        } 
    
    
    public class TestDbSet : DbSet, IQueryable, IEnumerable, IDbAsyncEnumerable
                where TEntity : class
        {
            ObservableCollection _data;
            IQueryable _query;
    
            public TestDbSet()
            {
                _data = new ObservableCollection();
                _query = _data.AsQueryable();
            }
    
            public override TEntity Add(TEntity item)
            {
                _data.Add(item);
                return item;
            }
    
            public override TEntity Remove(TEntity item)
            {
                _data.Remove(item);
                return item;
            }
    
            public override TEntity Attach(TEntity item)
            {
                _data.Add(item);
                return item;
            }
    
            public override TEntity Create()
            {
                return Activator.CreateInstance();
            }
        }
    
        [TestClass]
        public class CommitteeServiceTest
        {
            private InterimCommitteeContextTest _interimCommitteeContext;
            private ICommitteeService _service;
            private string _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]
            public void GetCommittee_ProvideInterimCommitteeId_ReturnOneCommittee()
            {
                //Arrange
                AddCommittees();
    
                //Act and Assert
                var result = _service.GetCommittee(_interim, 1);
                Assert.AreEqual(1, result.CommitteeId); //Passes.  IsActive set to true;
                result = _service.GetCommittee(_interim, 0);
                Assert.IsNull(result); //Fails.  No committeeId = 0;
                result = _service.GetCommittee(_interim, 2);
                Assert.IsNull(result); //Fails.  CommitteeId = 2 is not active.
            }
    
            [TestMethod]
            public void AddCommittees()
            {
                _interimCommitteeContext.Committees.Add(new Committee() { CommitteeId = 1, InterimIdentifier = _interim, IsActive = true, CommitteeTypeId = 1 });
                _interimCommitteeContext.Committees.Add(new Committee() { CommitteeId = 2, InterimIdentifier = _interim, IsActive = false, CommitteeTypeId = 1 });
                _interimCommitteeContext.Committees.Add(new Committee() { CommitteeId = 3, InterimIdentifier = _interim, IsActive = true, CommitteeTypeId = 1 });
            }
        }