2017-01-18 3 views
2

Мне нужен один из моих макетов, чтобы вернуть специально инициализированный объект. Моя текущая настройка:Как инициализировать объект с помощью EntityCollection?

_mockOrganizationService.Setup(
     x => x.Retrieve("serviceappointment", It.IsAny<Guid>(), It.IsAny<ColumnSet>())) 
    .Returns(new ServiceAppointment()); 

Однако, вместо того, чтобы возвращать new ServiceAppointment(), мне нужно еще немного как:

new ServiceAppointment{new EntityCollection("resources")}... 

Метод испытуемый выполняет:

var sa = serviceAppointment.GetAttributeValue<EntityCollection>("resources"); 

Как инициализировать ServiceAppointment с EntityCollectionb, чтобы я не получал исключение NullReferenceException?

ответ

1

Учитывая, что услуга определяется как

public interface IOrganizationService { 
    Entity Retrieve(string entityName, Guid id, ColumnSet columnSet); 
} 

И используя this example из документации, Субъект вручную можно определить для использования в тесте.

// Instaniate a serviceappointment object 
var serviceAppointment = new Entity("serviceappointment"); 
// Set the attributes you want for the test 
serviceAppointment["resources"] = new EntityCollection(); 
// Create mock service 
var _mockOrganizationService = new Mock<IOrganizationService>(); 
//Setup retrieval of entity 
_mockOrganizationService 
    .Setup(x => x.Retrieve(serviceAppointment.LogicalName, It.IsAny<Guid>(), It.IsAny<ColumnSet>())) 
    .Returns(serviceAppointment); 

var service = _mockOrganizationService.Object; 

Это должно позволить метод испытуемый, чтобы быть в состоянии назвать

var sa = serviceAppointment.GetAttributeValue<EntityCollection>("resources"); 

при условии, что sa был получен с помощью высмеивал службы.

1

Я собираюсь предположить, что вы хотите вернуть населенный объект в качестве своего EntityCollection.

Это образец приложения для заполнения EntityCollection для использования в поле PartyList на Entity. Доказательство того, что консоль покажет 2 при исполнении.

void Main() 
{ 

    var serviceAppointment = new Entity("serviceappointment") 
    { 
     Attributes = new AttributeCollection() { { "resources", GetResources() } } 
    }; 

    var sa = serviceAppointment.GetAttributeValue<EntityCollection>("resources"); 

    Console.WriteLine(sa.Entities.Count); 
} 

public EntityCollection GetResources() 
{ 
    var entityList = new List<Entity>(); 
    entityList.Add(new Entity("resource") 
    { 
     Attributes = new AttributeCollection() { { "name", "Truck" }} 
    }); 

    entityList.Add(new Entity("resource") 
    { 
     Attributes = new AttributeCollection() { { "name", "Tool" } } 
    }); 

    return new EntityCollection(entityList); 

} 
1

Дразнящий CRM is hard. Вот почему я написал схему, облегчающую мою жизнь. Использование XrmUnitTest вы можете написать свой тест, как это:

var service = LocalCrmDatabaseOrganziationService.CreateOrganziationService<CrmContext>(); 
service.Create(new ServiceApointment{ 
    Resources = new EntityCollection(); 
}); 

var serviceAppointment = service.GetFirstOrDefault<ServiceAppointment>(); 
// serviceAppointment will have a Resources Attribute that is empty. 
+0

каковы преимущества вашего framewokr над fakexrmeasy? –

+0

У меня нет зависимости от структуры тестирования, и я предоставляю много дополнительных возможностей для создания и запуска теста локально или против сервера crm. Очень похожая концепция IOrganizationService Fake. – Daryl

Смежные вопросы