Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用类型约束模拟泛型方法_C#_Unit Testing_Moq - Fatal编程技术网

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基于显示的代码,测试对象是不可模仿的,不应被模仿。