कहा जाता है मुझे Moq का उपयोग करके कुछ परेशानी होती है। निम्नलिखित इकाई परीक्षण एक अपवाद फेंकता है, भले ही विधि विधि कहा जाएगा।Moq सत्यापित विधि विफल रहता है भले ही विधि
[TestMethod]
public void CreateFinishTest() {
// mock methods
factoryMock.Setup(f => f.LoadPlan("TestPlanDoNotUse")).Returns(testPlan).Verifiable();
factoryMock.Setup(f => f.CreateFinish(It.IsAny<CreateFinishMessage>(), It.IsAny<string>())).Returns(testFinish.Id).Verifiable();
try {
var cfm = new CreateFinishMessage() {
ClientId = 11,
MessageId = 23456,
CustomerId = 6,
FinishName = "MyFinish",
PlanId = "TestPlanDoNotUse"
};
var cmd = sysCfg.Executor.CreateFinish(cfm); // calls LoadPlan with cfm.PlanId and CreateFinish with cfm and cfm.PlanId
sysCfg.Executor.Execute(cmd);
factoryMock.Verify(f => f.LoadPlan("TestPlanDoNotUse"), Times.Exactly(1));
factoryMock.Verify(f => f.CreateFinish(It.IsAny<CreateFinishMessage>(), It.IsAny<string>()), Times.Exactly(1));
} catch (Exception exc) {
Assert.Fail(exc.Message);
}
}
यह त्रुटि होती है:
Expected invocation on the mock exactly 1 times, but was 0 times: f => f.LoadPlan("TestPlanDoNotUse")
Configured setups:
f => f.LoadPlan("TestPlanDoNotUse"), Times.Once
Performed invocations:
IFactory.LoadPlan("TestPlanDoNotUse")
Factory.CreateFinish(IndiValue.LiveMarket.IndiCore.Communication.MessagingFormat.CreateFinishMessage, "MyFinish")
मैं कई अलग अलग सत्यापित करें-कॉल की कोशिश की है, लेकिन यह काम नहीं करेगा। और जो त्रुटि होती है वह काफी भ्रमित लगता है कि यह कहता है कि LoadPlan("TestPlanDoNotUse")
कभी नहीं कहा जाता है, लेकिन यह @ प्रदर्शन किए गए आमंत्रण सूचीबद्ध है।
समस्या हल:
मैं मैं समस्या पाया लगता है, है ना एक Moq समस्या थी। sysCfg.Executor.CreateFinish(cfm)
में एक नया धागा बनाया गया था और शुरू किया गया था। यह धागा समाप्त नहीं हुआ था और इसलिए factoryMock.Verify(...)
विफल रहा।
मैं AutoResetEvents प्रयोग किया है:
// create AutoResetEvent triggers
AutoResetEvent m_testTrigger1 = new AutoResetEvent(false);
// mock methods
factoryMock.Setup(f => f.LoadPlan(It.IsAny<string>())).Returns(testPlan).Callback(() => m_testTrigger1.Set());
// do something
// wait for triggers
bool didReturn1 = m_testTrigger1.WaitOne(timeOut);
की सहायता के लिए धन्यवाद मैंने ऑटोआरसेट एवेन्ट्स का उपयोग किया: – Robar