См. Ниже пример mocks против заглушек с использованием C # и Moq framework. В Moq нет специального ключевого слова для Stub, но вы можете использовать объект Mock для создания заглушек.
namespace UnitTestProject2
{
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
[TestClass]
public class UnitTest1
{
/// <summary>
/// Test using Mock to Verify that GetNameWithPrefix method calls Repository GetName method "once" when Id is greater than Zero
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsTwelve_GetNameCalledOnce()
{
// Arrange
var mockEntityRepository = new Mock<IEntityRepository>();
mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));
var entity = new EntityClass(mockEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(12);
// Assert
mockEntityRepository.Verify(m => m.GetName(It.IsAny<int>()), Times.Once);
}
/// <summary>
/// Test using Mock to Verify that GetNameWithPrefix method doesn't call Repository GetName method when Id is Zero
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsZero_GetNameNeverCalled()
{
// Arrange
var mockEntityRepository = new Mock<IEntityRepository>();
mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));
var entity = new EntityClass(mockEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(0);
// Assert
mockEntityRepository.Verify(m => m.GetName(It.IsAny<int>()), Times.Never);
}
/// <summary>
/// Test using Stub to Verify that GetNameWithPrefix method returns Name with a Prefix
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsTwelve_ReturnsNameWithPrefix()
{
// Arrange
var stubEntityRepository = new Mock<IEntityRepository>();
stubEntityRepository.Setup(m => m.GetName(It.IsAny<int>()))
.Returns("Stub");
const string EXPECTED_NAME_WITH_PREFIX = "Mr. Stub";
var entity = new EntityClass(stubEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(12);
// Assert
Assert.AreEqual(EXPECTED_NAME_WITH_PREFIX, name);
}
}
public class EntityClass
{
private IEntityRepository _entityRepository;
public EntityClass(IEntityRepository entityRepository)
{
this._entityRepository = entityRepository;
}
public string Name { get; set; }
public string GetNameWithPrefix(int id)
{
string name = string.Empty;
if (id > 0)
{
name = this._entityRepository.GetName(id);
}
return "Mr. " + name;
}
}
public interface IEntityRepository
{
string GetName(int id);
}
public class EntityRepository:IEntityRepository
{
public string GetName(int id)
{
// Code to connect to DB and get name based on Id
return "NameFromDb";
}
}
}
Это ненамного короче, чем:
if($condition) $var = $value;
Подложка импорта модуля выполняется во время компиляции,
Вы могли бы сделать это, но я бы не стал, поскольку это довольно нечитабельно и глупо:
$myarray["foo"] == $bar ? $variablename = $myarray["foo"] : 0;
или
$myarray["foo"] == $bar && $variablename = $myarray["foo"];
Ваша "проблема" на самом деле не проблема. Ваш примерный код очень понятен и удобен в обслуживании. Я бы сказал, оставьте все как есть.
Вы - можете - удалить фигурные скобки, но это повлияет на ремонтопригодность.
Другой альтернативой является создание set_if_true (смешанный массив, строковый ключ, логическое условное ) функция-оболочка. Он скрывает то, что на самом деле происходит, но в зависимости от конкретной реализации это хороший вариант. (Например, объект типа конфигурации или серверная часть кэширования)
Ваше право, тернарность не подходит. Он предназначен для обработки части оператора if и else.
Просто используйте обычный оператор if.
if($myarray["foo"]==$bar) $variablename=$myarray["foo"];
Вы можете поместить исходное выражение в else
часть тернарной операции, но если вы хотите гарантировать однократное вычисление выражения, вам придется использовать временную переменную и оператор if
.
Тернарный язык не подходит, хотя его можно записать так, чтобы работало тройное.
Причина в следующем: вы пытаетесь использовать его не по назначению, что сделает ваш код неудобным для чтения другими разработчиками.
Установите для переменной значение себя в false case:
$variablename=($myarray["foo"]=="bar")? $myarray["foo"] : $variablename