Moq 可以模拟多简单的实体 class (POCO)?
How simple entity class (POCO) can be mocked with Moq?
我需要像这样测试简单的 class:
public class SomeEntity {
public int Id { get; set; }
public string Name { get; set; }
}
我想使用这个 class 对象的模拟来编写测试,如下所示:
var someMock = new Moq.Mock<SomeEntity>();
someMock.SetupGet(x => x.Id).Returns(12345678);
someMock.SetupGet(x => x.Name).Returns(It.IsIn(someList));
如您所知,Moq 框架需要接口或虚拟方法来创建代理对象。所以我的问题是:如何在没有实现接口的情况下模拟我的实体class或者用 virtual?
标记属性
更新:所有这一切最想要的结果是用多种可能的属性组合将最小起订量对象替换为我的单元测试。
更新 2:看起来我不需要模拟我的实体 class,我只需要使用 It.IsIn(someList)
:
遍历所有可能的组合
var someEntity = new SomeEntity {
Id = 12345678,
Name = It.IsIn(someList)
}
你不需要模拟它来测试它。
您应该能够直接在当前状态下使用 SomeEntity
进行测试(并自行测试,但测试自动属性似乎是浪费精力)。
如果你创建了一个 ISomeEntity
的接口,SomeEntity
实现了它,那么你就可以在任何使用它的东西中模拟它。然后,您将能够测试将 ISomeEntity
传入的方法的行为。
正如您所说,Moq 要求它是一个接口或虚拟方法才能工作。
public class SomeEntity : ISomeEntity {
public int Id { get; set; }
public string Name { get; set; }
}
public interface ISomeEntity {
int Id { get; set; }
string Name { get; set; }
}
然后
var someMock = new Mock<ISomeEntity>();
someMock.SetupGet(x => x.Id).Returns(12345678);
someMock.SetupGet(x => x.Name).Returns(It.IsIn(someList));
var result = somethingelse.Act(someMock.Obect);
如果您的对象像示例中一样无逻辑,则无需转到 Mock
var item = new SomeEntity();
item .Id = 12345678;
item .Name = "some name";
var result = somethingelse.Act(item);
你想通过在这里使用模拟获得什么好处?如果您尝试 运行 通过列表并验证其中的每个项目,It.IsIn 不会这样做(即使附加到模拟)它只会检查分配给模拟的值在允许值列表中。
这打破了每个测试格言的单个断言,但是,我认为这就是你想要的:
var item = new SomeEntity();
foreach (var name in someList)
{
item .Id = 12345678;
item .Name = name ;
var result = somethingelse.Act(item);
// Assert
}
我需要像这样测试简单的 class:
public class SomeEntity {
public int Id { get; set; }
public string Name { get; set; }
}
我想使用这个 class 对象的模拟来编写测试,如下所示:
var someMock = new Moq.Mock<SomeEntity>();
someMock.SetupGet(x => x.Id).Returns(12345678);
someMock.SetupGet(x => x.Name).Returns(It.IsIn(someList));
如您所知,Moq 框架需要接口或虚拟方法来创建代理对象。所以我的问题是:如何在没有实现接口的情况下模拟我的实体class或者用 virtual?
标记属性更新:所有这一切最想要的结果是用多种可能的属性组合将最小起订量对象替换为我的单元测试。
更新 2:看起来我不需要模拟我的实体 class,我只需要使用 It.IsIn(someList)
:
var someEntity = new SomeEntity {
Id = 12345678,
Name = It.IsIn(someList)
}
你不需要模拟它来测试它。
您应该能够直接在当前状态下使用 SomeEntity
进行测试(并自行测试,但测试自动属性似乎是浪费精力)。
如果你创建了一个 ISomeEntity
的接口,SomeEntity
实现了它,那么你就可以在任何使用它的东西中模拟它。然后,您将能够测试将 ISomeEntity
传入的方法的行为。
正如您所说,Moq 要求它是一个接口或虚拟方法才能工作。
public class SomeEntity : ISomeEntity {
public int Id { get; set; }
public string Name { get; set; }
}
public interface ISomeEntity {
int Id { get; set; }
string Name { get; set; }
}
然后
var someMock = new Mock<ISomeEntity>();
someMock.SetupGet(x => x.Id).Returns(12345678);
someMock.SetupGet(x => x.Name).Returns(It.IsIn(someList));
var result = somethingelse.Act(someMock.Obect);
如果您的对象像示例中一样无逻辑,则无需转到 Mock
var item = new SomeEntity();
item .Id = 12345678;
item .Name = "some name";
var result = somethingelse.Act(item);
你想通过在这里使用模拟获得什么好处?如果您尝试 运行 通过列表并验证其中的每个项目,It.IsIn 不会这样做(即使附加到模拟)它只会检查分配给模拟的值在允许值列表中。
这打破了每个测试格言的单个断言,但是,我认为这就是你想要的:
var item = new SomeEntity();
foreach (var name in someList)
{
item .Id = 12345678;
item .Name = name ;
var result = somethingelse.Act(item);
// Assert
}