2

私は静かに Moq フレームワークとユニットを初めて使用しています。私の目標は、モックオブジェクトに情報を挿入することであり、現在の値で挿入されたオブジェクトの数をカウントできるようにしたいと考えています。

次の方法でモックを作成します。

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);

現在、モック コンテキストには 2 つのポリシーがあります。同じ名前「policy2」のポリシーをさらに 2 つ追加したいので、追加すると、ポリシー名が「policy2」の 3 つのオブジェクトが作成されます。

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);

このコードは現在、正しく機能しています

4

1 に答える 1

2

データを保持するオブジェクトを持つ

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);

あなたが見逃していたのはそれだけです。

そこから、次のような linq クエリを使用できるようにCount()なり、モック dbset が列挙されます。

また、dbset を効果的に列挙できるようにするために、いくつかの小さな変更を加える必要があります。

//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());

サービスが dbset へのアクセスを許可するプロパティを公開すると仮定すると、そこでカウントをアサートするか、モック自体を介してアサートできます。

//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);
于 2016-11-21T13:46:02.823 に答える