แม้ว่าฉันจะยอมรับว่า@ คำตอบของพอลเป็นวิธีที่แนะนำไปผมแค่อยากจะเพิ่มทางเลือกหนึ่งที่ให้บริการโดยmoqปิดตัวเอง
ตั้งแต่SomeClassเป็นabstractมันเป็น mockable แน่นอน แต่public void SomeMehod()ไม่ได้เป็น จุดคือการหาวิธีที่จะเยาะเย้ยและอย่างใดเรียกวิธีการนั้นและใช้เผยแพร่การเรียกไปCallBase SomeOtherMethod()มันอาจฟังดูเป็นการแฮ็ค แต่เป็นเนื้อหาที่เรียบง่าย สามารถใช้ในกรณีที่ไม่สามารถทำการปรับโครงสร้างที่เสนอมาได้
// This class is used only for test and purpose is make SomeMethod mockable
public abstract class DummyClass : SomeClass
{
public virtual void DummyMethod() => base.SomeMethod();
}
จากนั้นคุณสามารถตั้งค่าDummyMethod()เพื่อเผยแพร่การโทรโดยการตั้งค่าCallBaseสถานะ
//Arrange
var mock = new Mock<DummyClass>();
mock.Setup(m => m.DummyMethod()).CallBase();
//Act
mock.Object.SomeMethod();
//Assert
mock.Verify(m => m.SomeOtherMethod(), Times.Once);