c# - 使用计数方法

标签 c# unit-testing moq moq-3

我对 Moq 框架和unitests 还很陌生。我的目标是向模拟对象插入一些信息,并希望能够计算使用当前值插入的对象数量。

我通过以下方式构建我的模拟:

var mockCpmSqlDbContext = new Mock<CpmSqlDbContext>();
var mockSetPolicies = new Mock<DbSet<Policies>>();

var dataStore = new List<Policies>
{
    new Policies
    {
        PolicyID = 1,
        PolicyName = "policy1",
        PolicyDesc = "policy1desc"
    },
    new Policies
    {
        PolicyID = 2,
        PolicyName = "policy2",
        PolicyDesc = "policy2desc"
    },
};
var policyData = dataStore.AsQueryable();

mockSetPolicies.As<IQueryable<Policies>>().
    Setup(m => m.Provider).Returns(policyData.Provider);
mockSetPolicies.As<IQueryable<Policies>>().
    Setup(m => m.Expression).Returns(policyData.Expression);
mockSetPolicies.As<IQueryable<Policies>>().
    Setup(m => m.ElementType).Returns(policyData.ElementType);
mockSetPolicies.As<IQueryable<Policies>>().
    Setup(m => m.GetEnumerator()).Returns(policyData.GetEnumerator());


mockSetPolicies.Setup(x => x.Create<Policies>()).Returns(() => new Policies());
mockSetPolicies.Setup(x => x.Add(It.IsAny<Policies>())).Callback<Policies>(dataStore.Add);
mockSetPolicies.As<IQueryable<Policies>>().Setup(m => m.GetEnumerator()).Returns(() => policyData.GetEnumerator());

mockSetPolicies.Setup(x => x.Find(It.IsAny<Policies>()));

mockCpmSqlDbContext.Setup(m => m.Policies).Returns(mockSetPolicies.Object);
var service = new MSsqlProvider(mockCpmSqlDbContext.Object);

我目前在模拟环境中有两项政策。 我想再添加两个具有相同名称“policy2”的策略,因此添加后我将拥有三个策略名称为“policy2”的对象。

service.AddPolicy(new Policies {PolicyID = 3, PolicyName = "policy2", PolicyDesc = "pDesc3"});
service.AddPolicy(new Policies { PolicyID = 4, PolicyName = "policy2", PolicyDesc = "pDesc3" });

我的添加策略功能:

public void AddPolicy(Policies policy)
{
    _dbEntities.Policies.Add(policy);
    _dbEntities.SaveChanges();
}

检查断言的代码:

//Assert
var expected = 3;
//first, can I know how many object I have the policy name "policy2".
var actual = mockSetPolicies.Object.Count(p => p.PolicyName == "policy2");
//second, can I assert the number of objects I have currently with the name "policy2".
Assert.AreEqual(expected, actual);

此代码现在可以正常工作

最佳答案

有一个对象来保存数据

var dataStore = new List<Policies>
{
    new Policies
    {
        PolicyID = 1,
        PolicyName = "policy1",
        PolicyDesc = "policy1desc"
    },
    new Policies
    {
        PolicyID = 2,
        PolicyName = "policy2",
        PolicyDesc = "policy2desc"
    },
};

var policyData = dataStore.AsQueryable();

设置模拟以将记录插入到您的数据存储中。

mockSetPolicies
    .Setup(x => x.Add(It.IsAny<Policies>()))
    .Callback<Policies>(dataStore.Add);

这就是你所缺少的。

从那里您应该能够使用像 Count() 这样的 linq 查询,它将枚举模拟数据库集。

您还需要进行一些小的修改才能有效地枚举数据库集。

//Change this to use a Func delegate to allow multiple calls.
mockSetPolicies.As<IQueryable<Policies>>()
    .Setup(m => m.GetEnumerator())
    .Returns(() => policyData.GetEnumerator());

//Set this up to return a new model if it is being used.
mockSetPolicies
    .Setup(x => x.Create<Policies>())
    .Returns(() => new Policies());

假设服务公开了一个允许访问数据库集的属性,您可以在那里断言计数或通过模拟它本身来断言计数。

//Act
service.AddPolicy(new Policies {PolicyID = 3, PolicyName = "policy2", PolicyDesc = "pDesc3"});
service.AddPolicy(new Policies { PolicyID = 4, PolicyName = "policy2", PolicyDesc = "pDesc3" });
///Assert
var expected = 3;
//first, can I know how many object I have the policy name "policy2".
var actual = mockSetPolicies.Object.Count(p => p.PolicyName == "policy2");
//second, can I assert the number of objects I have currently with the name "policy2".
Assert.AreEqual(expected, actual);

关于c# - 使用计数方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40721506/

相关文章:

c# - Returnssasync(null) 在 VS15 中使用 Moq 进行单元测试时创建构建错误

unit-testing - 如何单元测试机器控制功能或中间件控制功能

c# - UrlHelper 类在 Asp.net mvc 中抛出空异常

c# - 如何在单元测试中模拟 RestSharp 可移植库

c# - 比较 "Apple"和 "Orange"对象的列表

c# - Entity Framework 数据库更新但数据库上下文未显示更新

java - 如何对自定义 RecordReader 和 InputFormat 类进行单元测试?

c# - 限制/限制 serviceBus 队列以触发 ServiceBusTrigger 形式的消息

c# - 根据自定义条件防止个别 session 过期?

c# - 在 blazor web 程序集中,每秒调用 StateHasChanged() 是最佳选择吗?