Mặc dù tôi đồng ý rằng câu trả lời của @ Paul là cách được đề xuất nhưng tôi chỉ muốn thêm một cách thay thế được cung cấp bởi moq
chính bản thân.
Kể từ khi SomeClass
là abstract
nó thực sự là mockable, nhưng public void SomeMehod()
không phải vậy. Vấn đề là tìm cách giả định và bằng cách nào đó gọi phương thức đó và sau đó sử dụng CallBase
tuyên truyền cuộc gọi đến SomeOtherMethod()
. Nghe có vẻ như là một hack nhưng về bản chất nó đơn giản. Nó có thể được sử dụng trong trường hợp nếu không thể tái cấu trúc đề xuất.
// This class is used only for test and purpose is make SomeMethod mockable
public abstract class DummyClass : SomeClass
{
public virtual void DummyMethod() => base.SomeMethod();
}
Sau đó, bạn có thể thiết lập DummyMethod()
để truyền bá cuộc gọi bằng cách đặt CallBase
cờ.
//Arrange
var mock = new Mock<DummyClass>();
mock.Setup(m => m.DummyMethod()).CallBase();
//Act
mock.Object.SomeMethod();
//Assert
mock.Verify(m => m.SomeOtherMethod(), Times.Once);