Условный оператор только с истинным оператором

См. Ниже пример 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";
        }
    }
}
5
задан chaos 16 July 2009 в 16:23
поделиться

8 ответов

Это ненамного короче, чем:

if($condition) $var = $value;
10
ответ дан 18 December 2019 в 06:23
поделиться

Подложка импорта модуля выполняется во время компиляции,

8
ответ дан 18 December 2019 в 06:23
поделиться

Вы могли бы сделать это, но я бы не стал, поскольку это довольно нечитабельно и глупо:

$myarray["foo"] == $bar ? $variablename = $myarray["foo"] : 0;

или

$myarray["foo"] == $bar && $variablename = $myarray["foo"];
3
ответ дан 18 December 2019 в 06:23
поделиться

Ваша "проблема" на самом деле не проблема. Ваш примерный код очень понятен и удобен в обслуживании. Я бы сказал, оставьте все как есть.

Вы - можете - удалить фигурные скобки, но это повлияет на ремонтопригодность.

Другой альтернативой является создание set_if_true (смешанный массив, строковый ключ, логическое условное ) функция-оболочка. Он скрывает то, что на самом деле происходит, но в зависимости от конкретной реализации это хороший вариант. (Например, объект типа конфигурации или серверная часть кэширования)

2
ответ дан 18 December 2019 в 06:23
поделиться

Ваше право, тернарность не подходит. Он предназначен для обработки части оператора if и else.

Просто используйте обычный оператор if.

if($myarray["foo"]==$bar) $variablename=$myarray["foo"];
1
ответ дан 18 December 2019 в 06:23
поделиться

Вы можете поместить исходное выражение в else часть тернарной операции, но если вы хотите гарантировать однократное вычисление выражения, вам придется использовать временную переменную и оператор if .

0
ответ дан 18 December 2019 в 06:23
поделиться

Тернарный язык не подходит, хотя его можно записать так, чтобы работало тройное.

Причина в следующем: вы пытаетесь использовать его не по назначению, что сделает ваш код неудобным для чтения другими разработчиками.

0
ответ дан 18 December 2019 в 06:23
поделиться

Установите для переменной значение себя в false case:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"] : $variablename
0
ответ дан 18 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: