【发布时间】:2011-12-14 21:49:46
【问题描述】:
我正在开发一个同步引擎。我有一个主引擎类,它从两个提供者(作为构造函数传入的对象)获取两个 PickList 列表。方法 SyncPickLists() 调用底层对象(两个提供者 + 一个记录器)上的方法,一个内部方法来获取所有要做的事情的列表,然后这样做:
public class SyncEngine {
public virtual ILoggingProvider Logger { get; private set; }
public virtual ICrmProvider CrmProvider { get; private set; }
public virtual ICacheProvider CacheProvider { get; private set; }
public SyncEngine(ILoggingProvider loggingProvider, ICrmProvider crmProvider, ICacheProvider cacheProvider) {
Logger = loggingProvider;
CrmProvider = crmProvider;
CacheProvider = cacheProvider;
}
public virtual void SyncPickLists() {
Logger.LogBeginPicklistSync();
// get all the pick lists from the local cache
var localCachePickLists = CacheProvider.GetPickLists().ToList();
// get all the pick lists from the remote system
var crmPickLists = CrmProvider.GetPickLists().ToList();
// build a sync plan
var changes = BuildPickListUpdatePlan(localCachePickLists, crmPickLists).ToList();
// run the sync
RunPickListSync(changes);
Logger.LogEndPicklistSync();
}
private IEnumerable<PickListAction> BuildPickListUpdatePlan(List<PickList> localCachePickLists, List<PickList> crmPickLists) {
...
}
}
我正在尝试使用 Moq 从同步引擎开始模拟和测试它,但遇到问题检查记录器上的方法被调用并评估从 BuildPickListUpdatePlan() 方法生成的结果。我认为这是因为我试图启动提供程序并调用 SyncPickLists()... 这可能是错误的方法。也许我应该使 BuildPickListUpdatePlan() 方法公开/内部(并适当地装饰程序集)并进行测试?在这里寻找输入,因为我是新手,不确定我是否以正确的方式进行。
这是我的测试到目前为止的样子,但它不完整、不正确或没有做我需要做的事情......
[TestMethod]
public void TestPickListSync() {
// assign
var _fakeCrmProvider = new Mock<ICrmProvider>().Object;
var _fakeCacheProvider = new Mock<ICacheProvider>().Object;
var _fakeLoggingProvider = new Mock<ILoggingProvider>().Object;
var _fakeSyncEngine = new Mock<CustomerSyncEngine>(_fakeLoggingProvider, _fakeCrmProvider, _fakeCacheProvider).Object;
// set picklists for CRM provider
var crmList1 = new List<string>() { "AAA", "CCC", "DDD" };
var crmList2 = new List<string>() { "WWW", "XXX", "YYY" };
var crmPickLists = new List<PickList>() {
new PickList(){ InternalName = "PickList1", DisplayName = "PickList1", Values = crmList1 },
new PickList(){ InternalName = "PickList2", DisplayName = "PickList2", Values = crmList2 }
};
Mock.Get(_fakeCrmProvider).Setup(x => x.GetPickLists()).Returns(crmPickLists);
Mock.Get(_fakeSyncEngine).SetupGet(x => x.CrmProvider).Returns(_fakeCrmProvider);
// set picklists for cache provider
var cacheList1 = new List<string>() { "AAA", "BBB", "CCC" };
var cacheList2 = new List<string>() { "WWW", "XXX", "ZZZ" };
var cachePickLists = new List<PickList>() {
new PickList(){ InternalName = "PickList1", DisplayName = "PickList1", Values = cacheList1 },
new PickList(){ InternalName = "PickList2", DisplayName = "PickList2", Values = cacheList2 }
};
Mock.Get(_fakeCacheProvider).Setup(x => x.GetPickLists()).Returns(cachePickLists);
Mock.Get(_fakeSyncEngine).SetupGet(x => x.CacheProvider).Returns(_fakeCacheProvider);
// act
_fakeSyncEngine.SyncPickLists();
// assert
Mock.Get(_fakeLoggingProvider).Verify(x => x.LogBeginPicklistSync(), Times.Once());
Mock.Get(_fakeLoggingProvider).Verify(x => x.LogEndPicklistSync(), Times.Once());
}
【问题讨论】:
-
问题,SyncEngine 和 public virtual 上的三个属性是用于测试的吗?
标签: moq