C# 使用类型约束模拟泛型方法
我想在类中测试一个方法:C# 使用类型约束模拟泛型方法,c#,unit-testing,moq,C#,Unit Testing,Moq,我想在类中测试一个方法: public class ClassUnderTest { public T SetProperty<T>(string value, T object) where T : AnObjectType, IAnotherObjectType { object.property = value; return object; } } 我想使用我的mock对象为我的类设置一个mock,并为我正在测试的方法设置CallBase,如下所
public class ClassUnderTest
{
public T SetProperty<T>(string value, T object) where T : AnObjectType, IAnotherObjectType
{
object.property = value;
return object;
}
}
我想使用我的mock对象为我的类设置一个mock,并为我正在测试的方法设置CallBase,如下所示:
class MockObjectType: AnObjectType, IAnotherObjectType
{
(implementation of IAnotherObjectType)
}
string value = "value";
MockObjectType mockObject = new MockObjectType();
Mock<ClassUnderTest> mockClassUnderTest= new Mock<ClassUnderTest>(MockBehavior.Strict);
mockClassUnderTest.Setup(foo => foo.SetProperty<It.IsSubtype<IAnotherObjectType>>(
It.IsAny<string>(), It.IsAny<It.IsSubtype<IAnotherObjectType>>()))
.CallBase();
var result = mockClassUnderTest.Object.SetProperty(value, mockObject);
Assert.That(result.property, Is.EqualTo(value));
string value=“value”;
MockObjectType mockObject=新的MockObjectType();
Mock mockClassUnderTest=新建Mock(MockBehavior.Strict);
mockClassUnderTest.Setup(foo=>foo.SetProperty(
It.IsAny(),It.IsAny())
.CallBase();
var result=mockClassUnderTest.Object.SetProperty(值,mockObject);
Assert.That(result.property,Is.EqualTo(value));
但此代码无法编译,显示错误:
类型“Moq.It.IsSubtype
”不能用作泛型类型或方法“SetProperty(string,T)
”中的类型参数“T”。没有从“Moq.It.IsSubtype
”到“AnObjectType
”的隐式引用转换
我做错了什么?我假设这是某种语法的问题,那么我应该如何表达我在这里要做的事情呢
编辑
我已经澄清了约束指定的对象类型之间的关系
我还应该澄清,我描述的测试是一个简化的测试。我还想验证该方法的其他行为,即调用其他模拟方法等。此验证需要使用被测类的模拟。我只想知道如何在模拟类上调用此方法。可以在不模拟测试下的实际方法的情况下对其进行测试
public void SetPropertySetsValue()
{
string value = "value";
MockObjectType mockObject = new MockObjectType(); // or create object of ObjectType
ClassUnderTest classUnderTest = new ClassUnderTest();
var result = classUnderTest.SetProperty(value, mockObject);
Assert.AreEqual(value, mockObject.property);
}
这将验证SetProperty()方法是否正确设置了该值 不要模仿受试者。模拟依赖项,使其在执行测试时表现出预期的行为
//Arrange
string value = "value";
var mockObject = new Mock<AnObjectType>();
mockObject.As<IAnotherObjectType>().SetupAllProperties();
// now the mock also implements IAnotherObjectType
mockObject.SetupAllProperties();
ClassUnderTest classUnderTest = new ClassUnderTest();
//Act
var result = classUnderTest.SetProperty(value, mockObject.Object);
//Assert
Assert.That(result.property, Is.EqualTo(value));
//排列
string value=“value”;
var mockObject=new Mock是ObjectType:IObjectType(实现IObjectType)?您要测试的是方法SetProperty()的行为?是的,我要测试SetProperty是否设置了属性。那么为什么要设置要测试的同一方法的行为?我不是,我使用的是CallBase属性。我的理解是,为了做到这一点,我需要指定参数。我不是在模拟该方法,而是在使用被测类的模拟,并使用CallBase在原始类中调用该方法。使用被测类的模拟意味着我可以指定MockBehavior.Strict,并验证它是否调用其他方法等。在单个测试中,您应该只测试一个行为,即如果它指定值?,对于测试同一方法的其他行为,您应该编写另一个测试。如果实现是正确的,则只需模拟外部依赖项,而不需要模拟被测的实际类。@aforest ccc从代码中删除.CallBase()时是否存在编译时错误?@aforest ccc没有说明具体问题或其他详细信息的,很难重现能够更好地理解实际问题的问题。我已经描述了我想要做的事情:模拟类上方法的CallBase。我已经描述了我遇到的问题:我无法计算出实现这一点的语法。我已经提供了尽可能少的代码来产生我遇到的问题,并演示了我尝试过的语法。@aforest ccc基于显示的代码,测试对象是不可模仿的,不应被模仿。