Здравствуйте! Подскажите, пожалуйста, как правильно работать с тестами которые взаимодействуют с бд. И если есть, то тесты взаимодействующие с базовыми веб-сервисами

Нравится

1 комментарий

Здравствуйте,

 

По поводу тестов с веб-сервисами - увы, примеров нет.

 

А вот по поводу тестов с БД: 

1) Развернуть на SQL сервере БД.

2) Настроить проект тестов например Base.UnitTests

 

а.В проекте открыть файл Integration.config

если такового у вас в проекте нет то необходимо добавить ссылку на Integration.config из проекта UnitTest. Сделать это можно посредством Visual Studio, либо добавив конфиг через файл проекта:

<None Include="..\UnitTest\Integration.config">
 <Link>Integration.config</Link>
 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>

b. прописать путь к базе данных в connectionString

<connectionStrings>
<add name="mssqlUnitTest" connectionString="Data Source=server_name; Initial Catalog=db_name; Persist Security Info=True; MultipleActiveResultSets=True; Integrated Security=SSPI; Pooling = true; Max Pool Size = 100; Async = true" />
</connectionStrings>

3) В файл App.config тестового проекта добавить (если ее нет) 

<appSettings>
    <add key="ConfigurationRuntimeDirectory" value="_путь_к_папке_Terrasoft.WebApp" />
</appSettings>

пример значения "_путь_к_папке_Terrasoft.WebApp" - "C:\Projects\Autocheckout\Creatio\TSBpm\Src\Lib\Terrasoft.WebApp.Loader\Terrasoft.WebApp" для примера, привожу файл App.config полностью

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
    </startup>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Common.Logging.Core" publicKeyToken="af08829b84f0328e" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-3.4.1.0" newVersion="3.4.1.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-3.4.1.0" newVersion="3.4.1.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
    <appSettings>
        <add key="ConfigurationRuntimeDirectory" value="C:\Projects\Autocheckout\Creatio\TSBpm\Src\Lib\Terrasoft.WebApp.Loader\Terrasoft.WebApp" />
    </appSettings>
</configuration>

4) Создать класс в тестовом проекте с учетом Name Convention

5) Создаем класс с тестом (кейс показывает возможность работы) будем через наш Entity создавать запись с константным именем и email контакта и проверять по email что такой контакт создался в базе.

[TestFixture, Category("Integration")]
public class ContactDataTests : BaseConfigurationTestFixture
{
 
    private const string ContactEmail = "testemail@test.com";
    private const string ContactName = "David";
 
    protected override IEnumerable<Type> GetRequiringInitializationSchemas() {
        EntitySchemaManager.AddCustomizedEntitySchema("Contact",
            new Dictionary<string, string> {
                { "Name", "MediumText"},
                { "Email", "MediumText"}
            });
        return new List<Type>();
    }
    [Test]
    public void SaveContactEmail_EmailSaved_EmailCorrect() {
        var contactSchema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
        var contact = contactSchema.CreateEntity(UserConnection);
        contact.SetColumnValue(contact.Schema.GetPrimaryColumnName(), Guid.NewGuid());
        contact.SetColumnValue("Email", ContactEmail);
        contact.SetColumnValue("Name", ContactName);
        contact.SetDefColumnValues();
        contact.Save(false);
        var select = new Select(UserConnection)
                            .Column("Name")
                        .From("Contact")
                        .Where("Email").IsEqual(Column.Const(ContactEmail)) as Select;
        using (DBExecutor dbExec = UserConnection.EnsureDBConnection()) {
            using (IDataReader reader = dbExec.ExecuteReader(select.GetSqlText(), select.Parameters)) {
                if (reader.Read()) {
                    Assert.AreEqual(ContactName, reader.GetColumnValue<string>("Name"));
                }
            }
        }
    }
}

Обязательно указать категорию Integration для класса тестов [TestFixture, Category("Integration")]

6) Запускаем тест стандартными средствами студии или Resharper. Результат запуска:

Показать все комментарии