模拟私有对象
Mocking a Private Object
我正在使用 C# 进行测试。我正在尝试从引用中模拟一个函数(使用 Moq)。下面是所提供代码的简化版本。
B.cs:
public class DeviceB:
public DeviceB():
// do some stuff
return something;
A.cs:
using B;
public class DeviceA:
private static DeviceB deviceB;
public DeviceA():
deviceB = DeviceB();
为了测试 class DeviceA
我想模拟 DeviceB()
来改变 deviceB
的行为。
我相信这应该是可行的,但我不知道如何实现。如果您有任何想法或建议,请告诉我。 (我最好使用 Moq vscode nuget,但我愿意接受其他选择。)
你有2个选择
声明 DeviceB
class 的 virtual
方法并将其传递给设备 A。
class DeviceB
{
public virtual void method1()
{
// Code [..]
}
}
class DeviceA
{
private DeviceB _deviceb;
public DeviceA(DeviceB deviceb)
{
_deviceb = deviceb;
}
// More code [..]
}
class UnitTest
{
[Fact]
public void TestMethod1()
{
// Arrange
var mock = new Mock<DeviceB>();
mock.Setup(..);
// Act
var devA = new DeviceA(mock.Object);
var result = devA.mymethod();
// Assert
Assert.....
}
}
为 DeviceB 方法声明接口(更好)并在 DeviceA 而不是 DeviceB 上使用它;将具体的 DeviceA 注入 DeviceB
interface IDeviceB
{
void Method1();
int AnotherMethod(int parm1);
}
class DeviceB : IDeviceB
{
// [..] Implementations
}
class DeviceA
{
private IDeviceB _deviceB;
public DeviceA(IDeviceB C)
{
_deviceB = deviceB;
}
}
class UnitTest
{
[Fact]
public void TestMethod1()
{
// Arrange
var mockedDeviceB = new Mock<IDeviceB>();
mockedDeviceB.Setup(..);
// Act
var devA = new DeviceA(mockedDeviceB.Object);
var result = devA.anotherMethod(1);
// Assert
Assert.....
}
}
我正在使用 C# 进行测试。我正在尝试从引用中模拟一个函数(使用 Moq)。下面是所提供代码的简化版本。
B.cs:
public class DeviceB:
public DeviceB():
// do some stuff
return something;
A.cs:
using B;
public class DeviceA:
private static DeviceB deviceB;
public DeviceA():
deviceB = DeviceB();
为了测试 class DeviceA
我想模拟 DeviceB()
来改变 deviceB
的行为。
我相信这应该是可行的,但我不知道如何实现。如果您有任何想法或建议,请告诉我。 (我最好使用 Moq vscode nuget,但我愿意接受其他选择。)
你有2个选择
声明 DeviceB
class 的 virtual
方法并将其传递给设备 A。
class DeviceB
{
public virtual void method1()
{
// Code [..]
}
}
class DeviceA
{
private DeviceB _deviceb;
public DeviceA(DeviceB deviceb)
{
_deviceb = deviceb;
}
// More code [..]
}
class UnitTest
{
[Fact]
public void TestMethod1()
{
// Arrange
var mock = new Mock<DeviceB>();
mock.Setup(..);
// Act
var devA = new DeviceA(mock.Object);
var result = devA.mymethod();
// Assert
Assert.....
}
}
为 DeviceB 方法声明接口(更好)并在 DeviceA 而不是 DeviceB 上使用它;将具体的 DeviceA 注入 DeviceB
interface IDeviceB
{
void Method1();
int AnotherMethod(int parm1);
}
class DeviceB : IDeviceB
{
// [..] Implementations
}
class DeviceA
{
private IDeviceB _deviceB;
public DeviceA(IDeviceB C)
{
_deviceB = deviceB;
}
}
class UnitTest
{
[Fact]
public void TestMethod1()
{
// Arrange
var mockedDeviceB = new Mock<IDeviceB>();
mockedDeviceB.Setup(..);
// Act
var devA = new DeviceA(mockedDeviceB.Object);
var result = devA.anotherMethod(1);
// Assert
Assert.....
}
}