2016-11-21 9 views
2

Я спокойно отношусь к Moq Framework и унитазам. моя цель состоит в том, чтобы вставить некоторую информацию в макет объекта и хотеть иметь возможность подсчитать количество объектов, вставленных с текущим значением.Использование метода подсчета

Я строю свой дразнят следующим образом:

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

этот код теперь работает currectly

+0

Можете ли вы предоставить дополнительную информацию о методе 'AddPolicy', пожалуйста. Какова реализация? Возможно, вы можете проверить вызовы на 'AddPolicy', но только если метод _virtual_. Или вы добавляете новый _interface_ в 'MSsqlProvider' с' AddPolicy' –

+0

@Dominik Herold добавлена ​​политика была добавлена ​​ –

ответ

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(), и он будет перечислять mock 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); 
+0

Привет, я получаю ошибку компиляции на .Callback (policyData .Add); –

+0

Хорошо, я вижу, где я ошибся. Держите, позвольте мне обновить его – Nkosi

+0

еще раз, но .Callback (dataStore.Add); не проходит компиляция –