gpt4 book ai didi

c# - 使用 Moq (C#) 监视对象

转载 作者:行者123 更新时间:2023-12-04 14:18:28 25 4
gpt4 key购买 nike

我正在构建一个 .NET Core 应用程序,我想使用 Moq 监视一个实例化的对象,但我还没有找到一种方法来做到这一点。

基本上,我需要的是所描述的 here作为 spy 。

我发现我可以调用类的基类方法 Foo使用以下方式:

 var mock = new Mock<Foo>();
mock.CallBase = true;

我的问题是 Moq 将创建一个新的 Foo 实例,而我需要的是使用一个已经实例化的对象并在调用对象的真实函数时只模拟真实对象的一个​​方法。

这是我要监视的对象的结构。
    public class Foo:Boo
{
Foo(Propeties props):base(props){}

public Baz MockMe(){...}

public Daz DoNotMockMe(){
return DoSomethingWith(Properties);
}
}

最佳答案

Moq 不支持现有对象。但是,它确实接受参数来调用构造函数。当我们使用像装饰器模式这样的变通方法时,这可能是解决方案。

请注意,在使用(现有)实例时有一个警告:使用模拟实例 ( carMock.Object ) 的类使用您配置的设置。但是,被测类本身 ( actualCar ) 不知道它正在被修饰,因此不会如下面的示例所示。

public class Car : ICar
{
public virtual string Manufacturer { get; set; }
public virtual string Model { get; set;}
public virtual string Name => $"{Manufacturer} {Model}";
}

public class CarTestHelper : ICar
{
private readonly ICar _innerCar;

public CarTestHelper(ICar car)
{
_innerCar = car;
}

// These properties use the existing instance passed in the constructor
public string Manufacturer { get => _innerCar.Manufacturer; set => _innerCar.Manufacturer = value; }
public virtual string Model { get => _innerCar.Model; set => _innerCar.Model = value; } // Virtual property can be mocked using Moq
public string Name => _innerCar.Name; // Does NOT use mocked 'Model'.
}

[TestFixture]
public class CarTests
{
[Test]
public void NameIsManufacturerWithModel()
{
var actualCar = new Car
{
Manufacturer = "Nissan",
Model = "100NX"
};

var carMock = new Mock<CarTestHelper>(actualCar) // Pass the decorated car as constructor parameter
{
CallBase = true
};

carMock.SetupGet(c => c.Model).Returns("200SX");

Assert.AreEqual("Nissan 200SX", carMock.Object.Name); // Will fail as the car will not used the mocked value.
}
}

当你从 ICar 继承时,Visual Studio 有一个很好的快速修复来自动实现装饰器模式。并将其作为构造函数参数。

关于c# - 使用 Moq (C#) 监视对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57692607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com