我想问下面方法 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);
}
答案 0 :(得分:0)
答案 1 :(得分:0)
创建一个Mock<IInterimCommitteeDbContext>
并将其传递给构造函数。在此对象上设置Meetings
和Committees
属性以返回各种集合。
您应该有不同的测试设置来返回不同的集合。例如,如果Meetings
和Committees
都为空,即数据库中没有数据,这应该如何表现?如果没有提供InterimIdentifier
的对象,它应该如何表现?如果有一个匹配等等怎么样。
答案 2 :(得分:0)
我想出了如何使用测试双打来做到这一点。我正在使用Entity Framework 6和代码第一个模型。我创建了一个继承自I-DbContext接口的DbContext。然后我能够创建内存数据以用于我的服务层单元测试。以下是一个例子:
此解决方案可从以下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 }); } }