Здравствуйте! Подскажите, пожалуйста, как правильно работать с тестами которые взаимодействуют с бд. И если есть, то тесты взаимодействующие с базовыми веб-сервисами
Нравится
Здравствуйте,
По поводу тестов с веб-сервисами - увы, примеров нет.
А вот по поводу тестов с БД:
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. Результат запуска: