Es ist durchaus sinnvoll, eine versiegelte Klasse zu verspotten, da viele Framework-Klassen versiegelt sind.
In meinem Fall versuche ich .Net MessageQueue-Klasse zu verspotten, so dass ich meine anmutige Ausnahmebehandlungslogik TDD.
Wenn jemand Ideen hat, wie Moq's Fehler in Bezug auf "Ungültiges Setup auf einem nicht überschreibbaren Mitglied" zu überwinden, lass es mich wissen.
Code:
[TestMethod]
public void Test()
{
Queue<Message> messages = new Queue<Message>();
Action<Message> sendDelegate = msg => messages.Enqueue(msg);
Func<TimeSpan, MessageQueueTransaction, Message> receiveDelegate =
(v1, v2) =>
{
throw new Exception("Test Exception to simulate a failed queue read.");
};
MessageQueue mockQueue = QueueMonitorHelper.MockQueue(sendDelegate, receiveDelegate).Object;
}
public static Mock<MessageQueue> MockQueue
(Action<Message> sendDelegate, Func<TimeSpan, MessageQueueTransaction, Message> receiveDelegate)
{
Mock<MessageQueue> mockQueue = new Mock<MessageQueue>(MockBehavior.Strict);
Expression<Action<MessageQueue>> sendMock = (msmq) => msmq.Send(It.IsAny<Message>()); //message => messages.Enqueue(message);
mockQueue.Setup(sendMock).Callback<Message>(sendDelegate);
Expression<Func<MessageQueue, Message>> receiveMock = (msmq) => msmq.Receive(It.IsAny<TimeSpan>(), It.IsAny<MessageQueueTransaction>());
mockQueue.Setup(receiveMock).Returns<TimeSpan, MessageQueueTransaction>(receiveDelegate);
return mockQueue;
}
Nicht verspotten! [Verwenden Sie stattdessen die Komposition] (http://stackoverflow.com/a/891820/274502). – cregox